La API D2XX básicamente es una forma de hacer que la API del archivo Win32 esté disponible en otros sistemas operativos. Todas sus funciones intentan funcionar exactamente como las API de Win32.
Varios programadores han aprendido un enfoque inferior a las comunicaciones, generalmente con malos ejemplos escritos por programadores de marcos que en realidad no usan puertos seriales a diario. Pregúntese cuál de estas conversaciones es mejor:
- > Háblame sobre los datos entrantes.
- < Ok.
- < EVENTO! Aquí hay algunos datos que acaban de llegar.
- > ¡Gracias! Por favor, dime si recibes más.
vs
- > Háblame sobre los datos entrantes.
- < Ok.
- < EVENTO! ¡Oí algo!
- > ¿Qué escuchaste?
- < Aquí están los datos recibidos.
- > ¡Gracias! Estoy listo para escuchar más datos.
Claramente, la primera versión es mucho más simple y más eficiente. Es por eso que lo desanimo a que pregunte "¿Cómo consigo que 'escuché algo?' ¿evento?" En su lugar, debe centrarse en cómo obtener el evento "Aquí está la nueva información".
Si desea un evento cuando su dispositivo conectado en serie le envía datos, use FT_W32_ReadFile
en el modo superpuesto. Cuando haces eso, la estructura OVERLAPPED tiene un miembro hEvent
, ese evento se activará cuando lleguen los datos 1 . Y los datos en sí ya estarán en su búfer, no necesitará una operación por separado para obtenerlos.
La clase .NET AutoResetEvent
es la forma de crear un objeto de evento de kernel que adjuntas al OVERLAPPED hEvent
.
1 En realidad, cuando finaliza la operación de lectura. Puede completarse porque se llenó el búfer o porque se produjo un tiempo de espera (configurado con FT_W32_SetCommTimeouts
). El ReadIntervalTimeout
es fantástico, porque hace que la lectura finalice siempre que haya un vacío en los datos. Esto generalmente corresponde a los mensajes individuales del dispositivo adjunto. Si bien no debe confiar en una lectura completada = un mensaje, el hecho es que tener un evento al final de un mensaje es la combinación óptima de búfer y capacidad de respuesta.