5.2被动接收类型
被动接收形的串口通信稍微麻烦一点,由于上位机是被动接收的,上位机不知道什么时候开 始下位机就已经有数据上来了,很有可能下位机发送到一半时,上位机刚好开始接收数据, 这时只能接收到后面一半的数据了,所以对于这种通信,一般是采用数据帧的方式进行通信。
这种数据帧的通信方式至少由三部分数据组成:帧头、数据、帧尾(如果数据是固定长度的 话,似乎帧尾也可以省掉)。
帧头是为了告诉上位机:从这以后的数据就是有用的数据了,相当于约定好的暗号,一般帧 头至少会用二个以上字节,如果只用一个字节的话,万一数据中的数据跟这个帧头一样了就 会误以为这个数据是帧头从而导致解析数据出错,帧尾的作用也差不多,告诉上位机从这之 前的数据才是有用的数据。但实际上一般的数据帧远不止这几个部分,还会加上一些校验字 节、时间信息、帧计数器之类的东东在上面。
其中校验字节是为了检查数据在传输过程中有没有出错的,跟串口的校验位要区分清楚,校 验位也是检查数据传输时有没有出错的,但由底层硬件来实现,校验方法由标准规定好,但 有几种可以选择,只有一个位(Bit,只能是0 或 1)。
校验字节是由软件层来实现的,至少有一个字节(Byte,有 8 个位),而且校验方式由用户 定义,非常灵活。
由于被动方式中串口的缓冲区中一直会有数据在,为了保持数据的连续性,在读取数据时 跟第一种仪器控制类型不一样。而是采取将读取的所有的串口数据都保存在移位寄存器中, 在软件上处理完这些数据后再将它们从移位寄存器中删除。
由于 VISA READ 的输出是字符串,所以一般使用“连接字符串”这个函数将它们连接起来, 然后接到循环结构中的移位寄存器中进行保存,当移位寄存器中的数据量达到一定时或满足 数据处理的条件时,才停止这个循环输出读取到的数据。一般如下图所示:
图 5 被动接收类型中的数据接收 在接收下位机发送的帧数据时,一定要先了解帧格式,这样才能正确解析出帧里面的数据来。 下面以例子来说明数据帧格式的通信。
设定通信数据帧每 7 个字节为一帧数据,其中以 0xAC、0x96 二个字节作为数据帧头,第三、 四个帧头为帧计数器,最大值为 0xFFFF,到达最大值后重新从 0 开始计数,第 4、5、6 三 个字节是数据信息,分别代表数据的高中低位,第 7 位为状态标志字节,它的第一位为 1 时表示下位机出错,为 0 时表示功能正常。
由于 LabVIEW 中接收到的数据都是以字符串的形式显示出来的,所以需要将字符串转换为
ASCII 码,一般可以直接使用“转换为 U8 数组”这个函数,如下图所示: