LABVIEW学习之(2)读写串口(VISA)

时间:2024-03-19 19:53:35

目录

1.目标

2.VI程序面板及讲解

(1)整体VI

(2)初始化配置和退出VISA

(3)写串口命令VI

(4)读串口数据VI

(5)数据恢复和重组


 


准备:LABVIEW,安装VISA(资源包可在NI官网下载,注意和LABVIEW的版本配合)

  • 1.目标

(1)下位机为单片机或DSP等,得到的两组数据Data0和Data1,数据Data0[i]宽度为16bit,但是串口收发数据以8bit为单位,因此下位机发送时将一个16bit数据拆分为两个部分(高8bit和低8bit),先发送Data0再发送Data1,程序类似下面方式:

         for(i=0;i<Number;i++)   {

                  BUFH=Data0[i]>>8;             //高8bit

                  BUFL=Data0[i]|0x00ff;        //低8bit

                  Send_OneChar(BUFH);    //这里的Send_OneChar()函数根据实际下位机编写

                  Send_OneChar(BUFL);

         }

(2)上位机LABVIEW制作上界面,接收来自串口的数据,并将数据恢复为16bit,最后将数据恢复为两组Data0和Data1;可支持上位机发送一次命令后,接收一次数据(与下位机收发程序配合)。

2.VI程序面板及讲解

(1)整体VI

整体VI的程序面板如下所示

LABVIEW学习之(2)读写串口(VISA)

 

         整体VI包括三大部分:一是配置串口数据(配置VISA资源)和初始化显示控件;二是写串口命令、读串口数以及数据重组和恢复;三是关闭串口。在出现错误或点击“stop”按钮时退出循环。

         需要注意,LABVIEW运行时,在没有数据流限制的地方,如果要控制运行步骤,需要加一个“顺序结构”同时配合数据流。例如上图中的②步,利用错误和VISA会话句柄控制“write=F”在VISA写入之后完成。

(2)初始化配置和退出VISA

         初始化包括两个部分,配置VISA资源和初始化显示控件。

配置VISA资源

  • VISA配置串口LABVIEW学习之(2)读写串口(VISA)和VISA清空I/O缓冲区LABVIEW学习之(2)读写串口(VISA)的位置:程序面板→函数选板→仪器I/O→VISA→高级VISA→总线/接口配置→串口。
  • VISA配置串口中VISA资源名(VISA Resource Name)显示控件插入,一是可以在程序面板右键点击引脚,然后“创建→输入控件”;二是在前面板→控件选板→I/O→VISA资源名称。
  • VISA配置串口中波特率、数据位使用数字输入控件,由用户自己输入指定值;或者是可以参照奇偶校验、停止位及数据流等使用下拉列表控件(Ring,将常用的值设置为选项。设置方式:选中下拉列表控件→右键→属性→编辑项,设置项(下拉列表显示项,可以是数字或字符串)和值(实际输出值,数值)即可。注意,枚举(Enum)和下拉列表(Ring)的区别在于,枚举编辑项中的值是固定的数值(从0开始递增)不可编辑。

初始化显示控件

         初始化清零显示控件,采用“局部变量”完成,位置“程序面板→函数选板→结构→局部变量”,然后选择所需表示的局部变量,局部变量可以是“读取”或“写入”,这里选择“写入”初始化值。

关闭串口

         关闭串口包括清空串口缓冲、关闭VISA及出现错误时显示错误。

LABVIEW学习之(2)读写串口(VISA)

         Simple Error Handler.vi位置“函数选板→对话框与用户界面→简单错误处理器”。

(3)写串口命令VI

LABVIEW学习之(2)读写串口(VISA)

         写串口命令子VI的程序框图如下所示,在无错误时,点击“write”向串口写入字符串数据;写入串口数据完成后,恢复“write”的值,通过事件顺序结构来控制运行步骤。

LABVIEW学习之(2)读写串口(VISA)

         图中“VISA Write.vi”的位置“函数选板→仪器I/O→串口”

(4)读串口数据VI

读取串口数据

  • 由于串口每次读取的数据有限,因此循环几次后读出全部数据,显示在String中(使用移位寄存器,保留读取的全部数据)。
  • 每次读取之前需要延时一段时间(默认50ms),否则读取会出错。
  • 判断数据完全读出的条件:移位寄存器中相邻的两次数据一致或数目一致(转换为无符号字节数组后数组大小一致)。

LABVIEW学习之(2)读写串口(VISA)

图中的“VISA Read”子VI如下,在无错误且Read=T(保持T)时读取串口数据(字符串格式)

LABVIEW学习之(2)读写串口(VISA)

(5)数据恢复和重组

在上一步已经完全收到了串口传来的数据(字符串格式),数据恢复和重组主要完成4步:

  • ①将读取的串口数据(字符串)转换为字节数组,使用LABVIEW学习之(2)读写串口(VISA),位置“编程→字符串→路径/数组/字符串转换→字符串至字节数组转换”;
  • ②将字节数组中的高8bit和低8bit(相邻两元素)恢复为16bit数据,并转换为十进制数值。子vi如下:

LABVIEW学习之(2)读写串口(VISA)

         抽取一维数组:当只抽取两组时,根据索引间隔抽取元素,将数组分为索引0,2,4,…和1,3,5,…两组。

         创建数组:此处是将元素加入一维数组后面中,配合移位寄存器使用。

        说明,在使用for循环时,选用“索引隧道”,就可以直接索引数组,不必设置循环次数,使用更灵活;for或while循环中,在数据需要叠加操作时,选用“移位寄存器”,就可以使用之前缓存的数据。

  • ③每次读取时接收到的是两组数据Data0和Data1,将上一步转换后的十进制数值数组根据数组大小,从中间分成两组,使用拆分数组LABVIEW学习之(2)读写串口(VISA)
  • ④使用移位寄存器和创建数组,使得在多次接收数据后,数据能有效的按组别划分。对这里的“创建数组”,新增的数组需要加在原数组后,保持数组维数不变,因此选择“连接输入”LABVIEW学习之(2)读写串口(VISA);后面合成二维数组时,不选择“连接输入”LABVIEW学习之(2)读写串口(VISA)