在与NI的设备进行串行通信时可以使用9个数据位吗?

更新 Nov 8, 2023

适用于

驱动

  • NI-VISA
  • NI-Serial

问题详述

在与NI的设备进行串行通信时,可以添加第9个数据位么?

解决方案

某些仪器的串行协议使用9位数据帧,而不是更常见的8位数据位和1位奇偶校验位。但是,所有NI系列产品上的UART仅支持5到8个数据位,偶(Even)/奇(Odd)/标记(Mark)/距离(Space)/无(None)校验位和1/1.5/2个停止位。由于UART不直接支持9位数据,所以驱动中也没有相关规则去实现它。

下面有两种不同的方法,可以用来实现9位通信。

1.将奇偶校验位用作第9个数据位:

发送端:

  1. 你需要将端口设置为8个数据位。
  2. 为了将第9位添加到传输中,你需要明确地设定传输的每个字节的校验位为Mark或Space,Mark是一个高的有效位(1),Space是一个低的有效位(0)。

例如,如需发送二进制数据000100010,可以发送十六进制0x88,并设置校验位为Space。如改为发送二进制000100011,仍然可以发送十六进制0x88,但是需要将校验位设为Mark。请注意,二进制表示时的最低有效位是最左边的一位,同样地,最低有效位也是串行传输时最先发送的一位。

接收端:

  1. 端口设置为8位数据,启动校验,检查Space或Mark。
  2. 每次读取一个字节。
  3. 如果得到任何校验错误,那么第9位应是设置的反位。
  4.  添加合适的比特。

例如,假定你设置校验位为Space,你读取了一个字节并且得到了一个校验错误,那么可以推断第9位应该是Mark并且将它添加进去。

这种方法的一个问题是,在LabVIEW7.0和之后的版本中,当NI-VISA收到带有错误校验的数据字节时,它会将这个串行数据的所有位都用默认为0的错误字符来代替,而LabVIEW6.1和之前的版本并不会这样做。你可以通过修改visaconf.ini文件来改变这个性能。

请注意,如果你的仪器只是需要接收第9位数据寻址,但从来没有在第9位上发送数据,那么你只需要根据仪器的需求设置一次校验位。

如何修改visaconf.ini文件以禁用错误替换位:

对于Windows XP用户, visaconf.ini文件位于<Documents and Settings> \ All Users \ Application Data \ National Instruments \ Nivisa文件夹中。

对于Windows Vista或更高版本的用户, visaconf.ini文件位于C:\ ProgramData \ National Instruments \ NIvisa文件夹中。

将下面的这两行添加到文件中并保存:

[ASRL-RSRC-ALIAS]
DisableErrorReplacement = 1


一些LabVIEW2010的用户可能会注意到,当重启电脑或者打开MAX时这个关键字会消失。为了确保在运行时这个关键字始终存在于visaconf.ini文件中,可以使用下面的代码片段,通过编程来添加关键字。


必须修改上面代码中的文件路径以匹配本地计算机上的visaconf.ini文件的位置。

2. 使用一个单独的微控制器处理9位帧:

另一种选择是使用一个单独的带有UART的微处理器来处理9位数据,将它作为仪器和计算机之间的中介。对于每一个9位帧,计算机可以发送两帧8位数据,前一帧是前8位,后一帧是第9位,然后由UART来将这两帧重编为一个9位帧,并发送到仪器。同样地,UART接收从仪器传来的9位帧,并将两个8位帧返回给计算机。