LabVIEW学习笔记(十一)——利用VISA进行串口通信

前言:

       在1993年,为了确保多厂商的仪器具有协同工作的能力以及降低包含了多厂商仪器的完整测试系统的开发时间,NI 联合许多大公司开发出来了虚拟仪器软件架构 ( Virtual Instruments Software ArchitectureVISA )。随着VISA 的出现,使得一套仪器控制程序适用于种硬件接口成为可能,通过调用相同的VISA库函数并配置不同的设备参数,就可以编写控制各种 I/O 接口仪器的通用程序。

       通过VISA用户能与大多数仪器总线连接,包括GPIBUSB、串口等等,无论底层是何种硬件接口,用户只需要面对统一的编程接VISA。所以今天来学习如何利用VISA进行串口通信。

 

  一、   VISA 函数 

          VISA 函数在函数面板的 仪器I/O ——> 串口子面板中,通过串口子面板中的这些 VISA 函数可以与GPIBUSB、串口等中的任何一种总线通信。

          用 LabVIEW 来写串口驱动控制仪器,只需要下图的几个函数即可。事实上,真的只需要下面几个函数:

         一般的串口控制结构是:配置(打开)串口、读写串口、关闭串口,接下来我们依次来学习这三个步骤。

 

1.1  配置(打开)串口

      配置串口是进入串口通讯的门槛,只有配置成功了,才能进行正确的通讯。首先我们看下 VISA 配置串口函数:

        这里有个小技巧,配置串口时最好是在对应的参数端口那里,右键,新建常量或者输入控件,然后再在新建出来的常量或者输入控件上面修改。因为,新建出来的数据类型,肯定是对的。接下来解释下主要的输入参数:

      (1)  启用终止符: 目的是使串行设备做好识别终止符的准备,默认值为TRUE, VI_ATTR_ASRL_END_IN属性设置为识别终止符;如值为FALSE,VI_ATTR_ASRL_END_IN属性设置为0(无)且串行设备不识别终止符。

      (2)终止符:通过调用终止读取操作。从串行设备读取终止符后读取操作终止。 0xA是换行符( \n )的十六进制表示。消息字符串的终止符由回车( \r )改为0xD。

      终止符的设置如下所示:

    (3) 超时:指定读/写操作的时间,以毫秒为单位。 默认值为10000ms,即10s。如果你设置了超时,等待超时时间到了,程序就不执行了,错误输出会输出错。
   (4)VISA资源名称:指定要打开的资源。VISA资源名称控件也可指定会话句柄和类。

   (5)波特率是传输速率。 默认值为9600。

   (6) 数据位是输入数据的位数。 数据位的值介于5和8之间。默认值为8。

   (7)奇偶指定要传输或接收的每一帧使用的奇偶校验。 

1.2  VISA读取

     首先看下 VISA 读取帮助:

        左边输入有个 VISA 字节总数,你必须指定你要读的字节数。那么问题来了,这个字节数怎么确定呢?

        一般读取串口的通信程序都如上图所示, VISA 读取函数 的 “读取字节数” 这个输入端口设置十分关键。由于在串口通信中,如果指定读取 100 个串口缓冲区的字节数,如果当前缓冲区的数据量不足 100 个时,程序会一直停在 VISA 读取 这个节点上,如果在超时的时间(默认是 10 秒)内还没有凑足 100 个数据的话,程序就会报 “Time out” 的错误,如果超时时间设置得太长,有可能导致程序很长时间停止在 VISA 读取 这个节点上。

        因此, 我们常采用上面的解决的办法:使用  “Bytes at Port” 这个串口的属性节点,在仪器I/O子面板下,如下图:

    也可以在 VISA 资源线上右键 >> 创建 >> Instr类的属性 >> Serial  Settings >> Number of Bytes at Serial Port,如下图所示:

       这个属性节点读取当前串口缓冲区有字节数,然后将它的输出连接到 VISA  读取 的 “读取字节数” 这个输入端上即可,这样当前缓冲区中有多少个字节就读回多少个,不会有任何等待。

       目前串口的应用大致有两种类型:一种是仪器控制类型的,一般是上位机发送一个指令,然后下位机作出响应,返回数据给
上位机,上位机再读取出来,完成一次通信,即一问一答;另一类是被动接收形的,即下位机会一直发送数据上来。

、实战

      我们新建一个空白 VI,借助串口调试助手和虚拟串口,在 LabVIEW 中编写的一个最简单的例子:写一个基本的读取串口字节的程序,在程序框图中编程如下:

注意这里,串口配置放到循环外,不要往复让这个执行。运行程序,在前面板我们可以看到:

 以下几点必须注意:

         (1)串口有个缓冲区,存在计算机内存里,VISA 读取,就是从缓冲区读取数据,读完之后,读取的就不存在缓冲区里了。如果你没读取,那就一直在缓冲区里,直到缓冲区溢出。 

        (2)如果有多个线程,都有读 VISA,或者一个 while循环 里,多个地方同时读,这样,肯定会有错。记住,保证一个串口,只有一个读,或者写。232 接口里,读和写可以同时进行,因为他是全双工的。而 485 半双工 2 线制时候,请注意,读和写不可以同时,因为是半双工。

         (3) 如果你单片机数据是间隔的,而且每次发送的是固定的数据。请自己设定VISA 读取的,字节数,比如设置为 8。这样的话,比延时读取要靠谱的多。

       如果我们需要传递的数据是数值型数据呢?我们重新发送:

       这个时候有人要问了,如果我们想把所有的字符串接收完后一次性取出来,也就是将串口没有接收的数据拼接到一起,然后集体提取,怎么办呢?这个,可以用移位寄存器或者反馈节点,然后用连接字符串拼接。我们稍微修改下程序框图,修改部分用红框框起来:

接下来,我们用串口助手给 Labview程序发生一段文字,看看它的拼接效果:

、  官方示例

      我们打开Labview中的一个官方示例,来学习基本的串行写入和读取,打开程序框图如下:

再看看对应的前面板如下所示:

猜你喜欢

转载自blog.csdn.net/weixin_41695564/article/details/82353630