在串行设备上读取VISA不会返回请求的字节数

更新 May 13, 2024

适用于

软件

  • LabVIEW

驱动

  • NI-VISA

问题详述

我正在尝试使用VISA通过串口接收一些二进制数据。

例如,我使用“VISA读取VI”或“viRead()”请求读取100个字节。但是,当我查看收到的数据时,发现我只得到前63个字节。如果我再读一次,可以得到剩余的37个字节。如果我再试使用“VISA读取”VI去接收数据,可能第一次读取时只接收54个字节,第二次读取时接收剩余的46个字节。这是怎么回事?

解决方案

用于串口的“VISA读取“将从串口缓冲区向程序返回一些字节。但是,返回的数据数量依赖于您的设置和与串口数据有关的3个重要因素:终止符,请求数据量和超时时间。

当下述任一陈述成立时,串口VISA读取将停止读取数据:
  1. 请求的字节数等于或小于串口中待读取的字节的数量,或者
  2. 已收到终止字符, 或者
  3. 串口没有可用的数据,而且再超时时间内,没有收到任何数据。
  4. 将输入"VISA配置串口""启用终止符"接线端的值更改为"假"

有关在NI-VISA中设置终止符的帮助,请参阅下面的相关链接。


如果你需要要实现标准协议(如MODBUS)的通信,可以考虑使用现有库。

相关信息

查看LabVIEW的串口通信范例程序(NI范例查找器»硬件输入与输出»串口»简单串口.vi),您会​​注意到它以 "VISA配置串口" 节点开始。在此处设置终止符(默认为十六进制0A(“换行”))和超时(默认为10秒)。


如果您正在读取串口数据时接收到了一个字节恰好匹配了设置的终止符,"VISA读取VI"将判定这就是所请求数据的末尾并将停止读取操作。发生这种情况是因为上述第二个条件已经满足,即使条件1尚未满足,VI尚未从串口读取到所有字节。

在正常文本通信中使用默认终止符通常不会导致出现问题。但是,二进制数据没有分配给0x0A字节的特殊含义。这也是在上面的示例中,第一次读取操作在63字节之后停止并且剩余的37个字节在软件缓冲区中等待被读取的原因。如果您通过串口进行二进制数据传输,建议要禁用“VISA配置串口”VI的终止符。