笔者的实验平台为STM32和AIR724UG,这两款芯片一种是常用的使用C语言开发的单片机一种是基于luat os的lua开发方式的通讯模块。算是可以比较本文所论述的使用自定义帧通过串口在不同平台进行数据交互的形式,算是抛砖引玉。
STM32与AIR724UG
概述
对于AIR724UG而言一般使用串口进行通讯,以下将介绍两种通讯协议的制订与实现方式,包含关于通讯协议通用性与帧长度之间的取舍。其中STM32使用C语言库函数编写、AIR724UG使用Lua脚本编写。
一般一个数据帧包含帧头、帧长度(包个数)、帧类型、数据包、校验位、帧尾、分隔符等元素。其中帧头、数据包和帧尾为基本元素,帧长度(包个数)、校验位、帧类型和位于数据包中的分隔符为可选参数。
一般帧长度可用于接收方对于帧尾的校验检测是否为一个完整的数据帧同时防止出现发送数据包中包含帧尾导致处理器只解析部分帧的情况出现。
校验位则是对帧内容是否发送正确的检测一般包括UART协议自带的奇偶校验、CRC(循环冗余校验)、数据和校验等方式。
分隔符位于数据包中对数据包中的多个内容进行切分。如发送温度湿度规定‘,’为分隔符则发送数据为温度12.5湿度45.0的数据包为“12.5,45.0”。但也有使用分隔符的方式即通讯双方规定好需要的参数类型按照数据包的那几位来进行解析如还是发送数据为温度12.5湿度45.0的数据包规定发送32位二进制数据高16位为温度低16位为湿度,温度的16位数据中高8位为整数位低8位为小数位,湿度同理。那么我们发送的数据也就变成了0x0c 0x05 0x2d 0x00。
其中第一种通讯方式发送字符串,第二种通讯方式发送16进制数。
发送字符串的好处在于参数数据长度不定长发送解析较为灵活(以分隔符作为分隔再使用库函数将字符串转换为对应的数据类型),坏处在于发送的数据较多数据帧较长。
发送16进制数的好处在于数据帧较短解析匹配相应的执行函数较为方便(C语言端函数指针、Lua端Table+函数名),坏处在于部分对于底层支持较差的平台移植可能比较困难,如Lua中对位操作支持较差。
示例
字符串数据帧
以发送温湿度为例
规定报头为"$SYS"
分隔符为‘,’
报尾为"A"
整个报文为"$SYS,23.5,35.0,A"
16进制数数据帧
以发送温湿度为例
规定报头为0x54
帧长度为6
温度占16位
湿度占16位
报尾为0x55
同样发送温室读为23.5/35.0
整个报文为0x54 0x06 0x17 0x05 0x23 0x00 0x55