"Buffer Overflow" con puerto serie cuando se usa VISA con "Flow Control"

Actualizado el May 13, 2019

Reportado en

Hardware

  • PXI Controller

Controlador

  • NI-VISA

Sistema Operativo

  • Windows
  • NI Linux Real-Time

Detalles del problema

Mi puerto serie está reportando un buffer overflow y estoy usando NI-VISA con flow control de software o hardware. ¿Por qué el flow control no evita los desbordamientos de la FIFO?

Solución

Este problema puede ser causado por varios factores. Estos incluyen la velocidad de su computadora, la velocidad en baudios que está utilizando, el tamaño de la FIFO de su puerto serie y el tamaño de la FIFO del instrumento que está transmitiendo datos al puerto serie.

El flow control esperará hasta que haya un número específico de bytes en el búfer antes de pedirle al procesador que envíe un mensaje o señal al otro dispositivo para que deje de transmitir. A velocidades de transmisión más altas, el puerto serie recibirá algunos bytes desde el momento en que se alcanza el nivel de flow control del búfer y el instrumento deja de transmitir. La entrada de estos bytes adicionales será mayor si un proceso de mayor prioridad tiene el control del procesador del dispositivo en tiempo real. Dado que el proceso es una prioridad más alta que la interrupción de VISA, el procesador no realizará ninguna acción hasta que el proceso de mayor prioridad finalice con el procesador del dispositivo en tiempo real.

La configuración predeterminada de VISA y Windows para una FIFO de 16 bytes es de 14 bytes, dejando 2 bytes en la FIFO cuando el dispositivo intenta enviar el mensaje al dispositivo de envío. A velocidades de transmisión más altas en computadoras más lentas, es muy posible recibir más de 4 bytes desde el momento en que el puerto en serie solicita al procesador que envíe la señal que el instrumento finalmente deja de transmitir.

En LabVIEW Real-Time o utilizando hardware serial de NI

Abra MAX y localice el puerto serie que tiene el problema en Devices and Interfaces . Después de hacer clic en el puerto COM, aparecerá una pestaña de Advanced Settings en el panel derecho. Estas configuraciones deberían permitirle reducir el tamaño del búfer de recepción. Debe reducir el tamaño del búfer hasta que se resuelva el problema.

Dependiendo de la carga del sistema (por ejemplo, largos períodos de tiempo dedicados a tareas de alta prioridad o ciclos), es más probable que se pierdan las tareas de procesamiento serial del hardware. Esto puede dar como resultado un exceso de RX FIFO, ya que el hardware serial no recibe la información con la frecuencia suficiente. Para evitar esto, configure el modo de manejo de interrupciones de NI-Serial. SecondaryInterrupts = 1 ha sido el comportamiento predeterminado desde que se introdujo el token en 3.1. Su nombre cambió a InterruptProcessingLevel en la versión 3.8. Consulte Performance on LabVIEW Real-Time en la Ayuda de NI-Serial para obtener más información sobre cómo configurar el modo de manejo de interrupciones. Esta configuración no tiene efecto para los módulos de la serie C.

En Compact RIO y FieldPoint

Abra MAX y encuentre los puertos serie conectados al controlador, notará que la pestaña Advanced no aparece. En lugar de usar esta pestaña para establecer el nivel de solicitud para elevar la línea de flow control de hardware, debemos modificar un archivo ubicado en el controlador. Modifique el archivo niserial.dbs ubicado en el directorio c:\ni-rt\system en el controlador. Directamente debajo de la línea SerialPortName = "COM1" agregue las siguientes líneas: RXFIFO = 1. Los valores posibles para el RXFIFO son 1, 4, 8 y 14. La modificación de este archivo le permitirá cambiar el nivel de activación del flow control de hardware .

En Windows

Para solucionar este problema, debe abrir el Administrador de dispositivos en Windows. Luego, encuentre el puerto COM para el que desea modificar la configuración y abra sus propiedades. A continuación, haga clic en la pestaña Avanzado. Verá un control deslizante que debería permitirle cambiar el tamaño del búfer de recepción, de modo que el UART habilite el control de flujo antes.
 

El valor predeterminado debería ser suficiente en la mayoría de los casos. Sin embargo, si obtiene errores de Buffer Overflow, debe disminuir este valor. Esto hará que se envíen más interrupciones al procesador y ralentizará los bytes en el UART. Si aumenta este valor, los bytes pueden desbordar el búfer FIFO.

Información adicional

Para la comunicación en serie, es fundamental comprender los tamaños del búfer, la configuración FIFO, la velocidad en baudios y las prioridades que el proceso de VISA en el procesador.