evento utilizando FTD2XX_NET.dll

1

Estoy usando un chip FT232RL con FTD2XX_NET.dll He creado un programa que escribe y lee datos en / desde AVR atmega32 mcu. Primero escribe datos, luego lee datos como respuesta.

Ahora, quiero hacer un evento que me indique si hay datos no leídos disponibles, solo cuando AVR envía datos al búfer de FTDI y SOLO en ese momento. Sin forzar mi programa a hacer bucles para verificar los datos disponibles. Para mi propósito, quiero hacer el mcu para enviar datos solo cuando él quiere, y la PC debe saber cuándo hay nuevos datos en el chip del búfer FTDI

    
pregunta MrBit

2 respuestas

1

Bueno, primero que nada, desde el lado de la PC, es imposible saber cuándo el AVR envía datos al chip FTDI, solo puede saber cuándo el FTDI envía sus datos a la PC. Voy a asumir que eso es lo que quisiste decir.

No recuerdo cuáles son todas las funciones en el contenedor .NET para Interfaz D2XX , pero en el ftd2xx.dll sin formato hay una función FT_SetEventNotification que hará lo que quieras. Estoy seguro de que está expuesto en la envoltura de .NET de alguna manera u otra.

De todos modos, crea un EventWaitHandle, pásalo a esa función y, mientras se abra el dispositivo, el controlador FTDI lo configurará como señalado cuando llegue un personaje. Tu programa, o tu ciclo de lectura, espera en ese identificador, luego, cuando llega un personaje, lees lo que está en el búfer y lo analiza.

Tenga en cuenta que todavía tendrá que hacer un ciclo una y otra vez mientras lee los datos, pero para lo que la señalización del evento es buena es más fácil para el uso de la CPU.

    
respondido por el whatsisname
0

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.

    
respondido por el Ben Voigt

Lea otras preguntas en las etiquetas