VISA Read en un dispositivo serial no devuelve el número solicitado de bytes

Actualizado el Dec 31, 2019

Reportado en

Software

  • LabVIEW

Controlador

  • NI-VISA

Detalles del problema

Estoy tratando de recibir algunos datos binarios a través de mi puerto serial usando VISA.

Por ejemplo, uso VISA Read VI o viRead () call y solicito 100 bytes. Sin embargo, cuando miro los datos recibidos, puedo ver que solo obtengo los primeros 63 bytes. Si hago otra lectura, puedo obtener los 37 bytes restantes. Podría usar el VISA Read VI nuevamente, pero solo recibiré 54 bytes con la primera lectura, y los 46 bytes restantes en la segunda lectura. ¿Que esta pasando?

Solución

VISA Read para serial devolverá una cantidad de bytes del búfer del puerto serie a su programa. Sin embargo, la cantidad de datos que devuelve depende de 3 detalles importantes sobre su configuración y sus datos en serie: su carácter de terminación, la cantidad de datos solicitados y el período de tiempo de espera.

Serial VISA Read dejará de leer cuando alguna de estas afirmaciones sea verdadera:
  1. El número de bytes solicitados es igual o menor que el número de bytes que esperan leer en el puerto
  2. El carácter de terminación ha sido recibido
  3. No hay más datos disponibles desde el puerto serie y el período de tiempo de espera ha transcurrido sin que se reciba ningún dato.
  4. Cambie la entrada Enable Termination Char de VISA Configure Serial Port a False .

Para obtener ayuda para configurar los caracteres de terminación en NI-VISA, consulte los enlaces relacionados a continuación.


Si está implementando un protocolo estándar (como MODBUS), considere usar una biblioteca existente.

Información adicional

Al observar el ejemplo de comunicación en serie de LabVIEW (NI Example Finder»Hardware Input and Output»Serial»Simple Serial.vi), notará que comienza con un nodo de VISA Configure Serial Port. Esto configura tanto el carácter de terminación (que por defecto es hexadecimal 0A ("salto de línea")) como el tiempo de espera (por defecto es 10 segundos).


Si está leyendo datos seriales y un byte que coincide con el carácter de terminación de la configuración, entonces VISA Read VI asumirá que este debe ser el final de los datos solicitados y detendrá la operación de lectura. Esto sucede porque la segunda condición anterior se ha cumplido, aunque la condición 1 no se haya cumplido y el VI no haya leído todos los bytes del puerto.

El uso del carácter de terminación predeterminado generalmente no causará problemas en las comunicaciones de texto normales. Sin embargo, los datos binarios no tienen un significado especial asignado al byte 0x0A. En el ejemplo anterior, esta es la razón por la cual la primera operación de lectura se detiene después de 63 bytes y deja los 37 bytes restantes en el búfer de software esperando a ser leídos. Si está realizando transferencias de datos binarios en serie, casi siempre deseará desactivar el carácter de terminación en el VISA Configure Serial Port VI.