目录
准备: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的程序面板如下所示
整体VI包括三大部分:一是配置串口数据(配置VISA资源)和初始化显示控件;二是写串口命令、读串口数以及数据重组和恢复;三是关闭串口。在出现错误或点击“stop”按钮时退出循环。
需要注意,LABVIEW运行时,在没有数据流限制的地方,如果要控制运行步骤,需要加一个“顺序结构”同时配合数据流。例如上图中的②步,利用错误和VISA会话句柄控制“write=F”在VISA写入之后完成。
(2)初始化配置和退出VISA
初始化包括两个部分,配置VISA资源和初始化显示控件。
配置VISA资源
- VISA配置串口和VISA清空I/O缓冲区的位置:程序面板→函数选板→仪器I/O→VISA→高级VISA→总线/接口配置→串口。
- VISA配置串口中VISA资源名(VISA Resource Name)显示控件插入,一是可以在程序面板右键点击引脚,然后“创建→输入控件”;二是在前面板→控件选板→I/O→VISA资源名称。
- VISA配置串口中波特率、数据位使用数字输入控件,由用户自己输入指定值;或者是可以参照奇偶校验、停止位及数据流等使用下拉列表控件(Ring),将常用的值设置为选项。设置方式:选中下拉列表控件→右键→属性→编辑项,设置项(下拉列表显示项,可以是数字或字符串)和值(实际输出值,数值)即可。注意,枚举(Enum)和下拉列表(Ring)的区别在于,枚举编辑项中的值是固定的数值(从0开始递增)不可编辑。
初始化显示控件
初始化清零显示控件,采用“局部变量”完成,位置“程序面板→函数选板→结构→局部变量”,然后选择所需表示的局部变量,局部变量可以是“读取”或“写入”,这里选择“写入”初始化值。
关闭串口
关闭串口包括清空串口缓冲、关闭VISA及出现错误时显示错误。
Simple Error Handler.vi位置“函数选板→对话框与用户界面→简单错误处理器”。
(3)写串口命令VI
写串口命令子VI的程序框图如下所示,在无错误时,点击“write”向串口写入字符串数据;写入串口数据完成后,恢复“write”的值,通过事件顺序结构来控制运行步骤。
图中“VISA Write.vi”的位置“函数选板→仪器I/O→串口”
(4)读串口数据VI
读取串口数据
- 由于串口每次读取的数据有限,因此循环几次后读出全部数据,显示在String中(使用移位寄存器,保留读取的全部数据)。
- 每次读取之前需要延时一段时间(默认50ms),否则读取会出错。
- 判断数据完全读出的条件:移位寄存器中相邻的两次数据一致或数目一致(转换为无符号字节数组后数组大小一致)。
图中的“VISA Read”子VI如下,在无错误且Read=T(保持T)时读取串口数据(字符串格式)
(5)数据恢复和重组
在上一步已经完全收到了串口传来的数据(字符串格式),数据恢复和重组主要完成4步:
- ①将读取的串口数据(字符串)转换为字节数组,使用,位置“编程→字符串→路径/数组/字符串转换→字符串至字节数组转换”;
- ②将字节数组中的高8bit和低8bit(相邻两元素)恢复为16bit数据,并转换为十进制数值。子vi如下:
抽取一维数组:当只抽取两组时,根据索引间隔抽取元素,将数组分为索引0,2,4,…和1,3,5,…两组。
创建数组:此处是将元素加入一维数组后面中,配合移位寄存器使用。
说明,在使用for循环时,选用“索引隧道”,就可以直接索引数组,不必设置循环次数,使用更灵活;for或while循环中,在数据需要叠加操作时,选用“移位寄存器”,就可以使用之前缓存的数据。
- ③每次读取时接收到的是两组数据Data0和Data1,将上一步转换后的十进制数值数组根据数组大小,从中间分成两组,使用拆分数组。
- ④使用移位寄存器和创建数组,使得在多次接收数据后,数据能有效的按组别划分。对这里的“创建数组”,新增的数组需要加在原数组后,保持数组维数不变,因此选择“连接输入”;后面合成二维数组时,不选择“连接输入”。