LABVIEW串口通信基础

写这一篇串口通信基础的契机是最近刚刚完成一个温箱的仪器控制程序,LABVIEW通过串口与温箱单片机通讯,我打算将过程中遇到的一些问题和收获列在这里方便有需求的网友比对、寻找答案。

学LABVIEW时间并不久,这个仪器控制程序也比较简单,行文中若有错误还望指出。

--------------------------------------------------------------------------------------------------------------------------------------------

LABVIEW串口通信基础

 

利用LABVIEW实现串口通信需要进行以下四部分准备:

1)  必要的硬件设备;

2)串口通信相关基础知识;

3)通讯协议;

4)基本的程序编写能力。

 

一、必要的硬件设备

在我的项目中,下位机的数据传输用的RS485,上位机是我的笔记本电脑,所以我的硬件设备只有三件:笔记本电脑、下位机和一根USB转RS485的转换线。

 

二、串口通信相关基础知识

1. 并行通信和串行通信

计算机通信可分为两大类:并行通信和串行通信。

并行通信通常是将数据字节的各位用多条数据线同时进行传送,如下图所示。

 

并行通信的特点是:控制简单、传输速度快。由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。

串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,如下图。

 

串行通信的特点是:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备。但数据的传送控制比并行通信复杂。

串口通信即串行通信。

2. 异步通信和同步通信

本文主要涉及异步通信。

异步通信是以字符帧为单位进行传输,字符帧与字符帧之间的时间间隔是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间是异步的,但同一个字符内的各位是同步的。

为了实现异步传输字符的同步,采用的办法是使传送的每一个字符都以起始位“0”开始,以停止位“1”结束。这样,传送的每一个字符都用起始位来进行收发双方的同步。异步通信的数据格式如下图所示。

 

由图可见,异步通信的每帧数据由4部分组成:起始位(1位)、字符数据位(5-8位)、奇偶校验位(1位,也可以没有校验位)和停止位(1或2位)。空闲位和停止位均为高电平,接收设备一旦监视到“0”电平的到来,说明起始位出现,就开始接收所规定的数据位和奇偶校验位以及停止位。

同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留空隙,即保持位同步关系,也保持字符同步关系。

3. 串行通信的传输方向

串行通信依数据传输的方向及时间关系可分为:单工、半双工和全双工。

 

单工是指数据传输仅能沿一个方向,不能实现反向传输。

半双工是指数据传输可以沿两个方向,但需要分时进行。

全双工是指数据可以同时进行双向传输。

本文中采用的RS485为半双工。

4. 串口配置参数

串行通信中几个参数要格外注意:比特率、数据位、停止位和奇偶校验位。

比特率描述数据的传输速率,是每秒钟传输二进制代码的位数,单位是位/秒。如每秒钟传送240个字符,而每个字符格式包含10位,则此时的比特率为2400bps。

数据位是一个字节中包含的有效数据信息的位数。

停止位用于判断某个字符是否传输结束,以便开始进入监视状态准备接收下一个字符。

奇偶校验位则用于判断字符在传输过程中是否有错误,包括奇校验、偶校验和无校验。当约定为奇校验时,数据中1的个数与校验位中1的个数之和应为奇数,偶校验同理。接收方和发送方的校验方式应一致,接收字符时,对1的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。

数据位、停止位和奇偶校验位共同确定了串口通信中数据编码的方式,即字符结构。在概念上要和通讯协议中的起始码、终止码和校验码区分开。和英语写作做个类比,串口参数(数据位、停止位和奇偶校验位)确定了每个单词中各个字母的排列规则,而通讯协议规定的报文格式(起始码、终止码和校验码等)确定了句子的语法,是各个单词排列组合的规则。

另外,在实际操作中会遇见n位、高n的说法。比如串口参数为1个起始位、8个数据位、1个停止位和1个奇偶校验位。

当需要传输的数值为6000时,它的二进制表示为:00010111 01110000,显然需要占用2个字节。

则计算机编码的数据为两个各含11个位的字节,各包括1个起始位、8个数据位、1个停止位和1个奇偶校验位,其中8个数据位分别为00010111 和 01110000。

其中00010111为高八位,01110000为低八位

根据通讯协议的要求,有时会是低位在前、高位在后,有时是高位在前、低位在后。数据处理中需格外注意。

 

三、通讯协议

仪器方会提供该仪器使用的通讯协议,所以这一部分只要搞清楚协议内容就好了。串口参数确定了每个数据怎么被计算机编码并传输,而通讯协议中的报文格式则会告诉我们怎样排列必要的数据以向下位机传达我们的命令。

比如每一条报文第一个字节写下位机的地址;第二个字节写功能码;第三、四两个字节写相关的寄存器地址等。上下位机之间基于这样的一种约定向彼此发送报文,同样基于这样一种约定解析对方发送来的报文,从而实现通信。

在报文的编写中可能遇到困难的一部分是校验码的计算。不过好在网络上已经有很多免费的校验码的小程序了,可以直接下载下来稍作修改作为子VI调用。

这有一个CRC校验的在线计算器,可以根据已有的正确报文判断其采用的校验方式,然后选择网络上已经有的对应的小程序进行修改和调用。

https://www.lammertbies.nl/comm/info/crc-calculation.html

这是一个CRC-CCITT的校验程序合集,另外pudn.com似乎是个不错的资源网站。

http://www.pudn.com/Download/item/id/1334218.html

校验码的计算中如果出现明明选择了对应的子VI并进行了正确的修改仍然无法正确输出校验码的情况,请务必检查一下数据输入、输出控件是正常显示的还是十六进制显示的,更改一下显示方式或许能解决问题。

 

四、LABVIEW串口通讯实现方法

百度一下“小草手把手教你LabVIEW仪器控制”。(写着写着不想写了哈哈,所以直接资源传送门)

其中提到要安装下位机的驱动,可能因为我的下位机比较低端,我是在连接下位机和笔记本后启动驱动精灵,自动扫描安装了一个对应的驱动。可以作为一种补充的方法吧。

另外个人感觉在串口通信中虚拟串口软件的用处并不大,其主要是用来检验下行报文的正确性,但其实在我编码完下行报文之后,写入VISA之前,只要输出一下我的下行报文不需要虚拟串口软件也是能够进行检查的。

最后读取报文回来的数据默认是十六进制显示,所以可以网上下载一个十六进制显示转化为正常显示的子VI,然后再进行报文解析。

 

最后,报文中负数的处理请把握两个关键词,1)补码和2)LABVIEW的I16和U16格式转化功能~

(I16是有符号十六进制;U16是无符号十六进制。)

 

串口基础知识部分参考书籍:《单片机原理及接口技术》(李全利等编著)

posted @ 2018-03-22 14:05  Sisyph_us  阅读(1163)  评论(0编辑  收藏  举报