LabVIEW串口通信详解
图 7 帧头查找程序
帧头查找到以后,再找数据就容易了,根据之前的定义,第4、5、6个字节是才是我们要的数据,所以直接使用索引号进行索引输出即可
。
一般情况下,如果是用三个字节表示一个数据的话,那么这三个字节分别表示为一个数据的高中低字节,即高字节要乘以25536再加上中字节乘以256再加上低字节的,这样定义后可表示的数据的范围就会扩大很多,但这里为了说明问题,直接认为三个字节的数据相加就是我们要的实际数据,在实际使用过程中应该根据帧格式的字义来解析这个数据。另外帧格式中定义了最后一个字节为状态标志位,所以提取数据前还要检查一下这个标志位是否正常,不正常时要进行相应的处理,这里不再详细描述。至此完成一次数据帧的提取。如果是没什么特殊的要求的话,这里应该也算到一段落了,有一些对测试时间有要求的地方,就会要求在最短的时间内得到最多的信息,从图6中我们可以看到,接收到的数据帧中,除了中间一个完整的帧之外,头尾还有一些无用的数据,其实这些数据中也包含了有用的信息的,比如我们可以从0xAC、0x96这二个帧的位置中推断中它前面的0x22、0x2A、0x38这三个字节也是我们想要的数据字节,但是由于没有接收到它的帧头,所以程序没能提取出来,但我们可以从后一帧的帧头推算出前面那一帧的数据字节是哪些,即使没收到前面那一帧的帧头。这里只给出一个流程,不再给出具体的程序。另外有可能接收的数据长度比较长,可能就不止包含了一帧的数据在里面,所以在程序中也要判断一下剩下的数据还够不够一帧的数据长度,如果够则可以根据上一次查找的帧头位置+数据帧长度来确定下一个数据帧的帧头位置了,不需要使用搜索的方法。也可能存在处理完一帧数据后,剩下的数据不够一个帧的,这时可以将这些剩下的数据保留起来,将它添加到下一次接收到的数据前面,组成新的数据再进行处理。去掉已经处理的数据可以使用“删除数组元素”这个函数来实现。这里也不再给出具体的程序。6,串口数据类型的转换
由于LabVIEW中VISA Read/Write这二个函数都是只能读取/写入字符串类型的数据的,而有时候需要接收/写入的数据类型不一定是字符串,导致在刚开始接触的时候会有一点困惑。 在进行数据转换时,只要记住计算机中所有数据都是以二进制保存这个原则就容易解决问题了。串口线上传输的也是高低,串口接收到的也是二进制数据,只是到LabVIEW后被转换为字符串格式了。还是以例子进行解释。假设LabVIEW从串口接收到的数据为“1234”(正常显示模式下),那么这个数据在串口底层的时候其实是这样的二进制数据: