在数据流通讯中,如串口、网口通讯,软件需要对采集的数据帧进行处理。处理前需要提取出完整的数据帧。
提取数据帧一般是通过识别出帧头后,再向后读取整包数据帧长度(减去帧头)个字节来提取。
数据帧头如常用的十六进制数 EB90 FAF3 AA55 55AA,可通过匹配模式函数或者正则表达式函数进行识别。
由于labview没有合适的截取字符串函数,例如从指定位置删除指定长度的字符,返回剩余字符串和删除的字符串,无法很方便的实现这个功能。
因此想要从采集到的一段数据帧中识别出一包完整数据帧可采用能表示整个数据包的正则表达式。
以帧头为0xEB90,数据为5个字节的数据包为例,正则表达式为0xEB 90 2E 2E 2E 2E 2E。
其中0x2E是asic字符中的(.)在正则表达式中表示匹配一切字符。
好了,此处开始出现问题。对于上述情况,如果帧头为0xEB90,则匹配模式和正则表达式两个函数都没有问题,能够匹配上。当帧头为0x55AA时,此时匹配模式函数已不能匹配。因此正则表达式函数基本上能够适应随意帧头设置。
还有一个特殊情况,当帧头中出现0x00时,正则表达式函数报错,不能进行匹配,但匹配模式函数能够匹配帧头中带有0x00字符的字符串。
但绝大多数情况下,帧头都不会包含0x00这个字符。
还有几点注意事项,正则表达式函数,容易报错,即使已经匹配成功,需要在后面加上清除错误函数。匹配模式函数不会报错,这个函数也没有错误输出。
另外需要注意区别空字符和空字符常量。空字符在labview中是一个实际的字符,十六进制为0x00,占用一个字节。空字符常量没有十六进制数,不占用字节,在字符串中无法显示。