文章首发于同名微信公众号:DigCore
欢迎关注同名微信公众号:DigCore,及时获取最新技术博文。
原文链接:https://mp.weixin.qq.com/s/amO7rGkqFJtCzuyjyIVwDw
(说明:此处的文章从微信公众号拷贝而来,图片或者排版上可能存在一定的瑕疵,欢迎点击原文链接阅读)
串口实现了两个终端设备之间进行可靠的通信,串口在这中间完成了传输层的作用。本次要讲的是关于数据的协议。
类似场景
A:洞幺!洞幺!我是洞拐!收到请回答!收到请回答!over!
在战争题材影视剧中经常能够看到这样的对白,在通过对讲机等相关无线设备呼叫队友时,先呼叫对方名称,然后告知自己身份,说完内容最后再说over,表示一次呼叫结束。
是的,没错,这就是本节要讲的在串口通信中发挥重要作用的起止式协议!
UART的时序本身就是起止式协议,具体可参考《嵌入式硬件通信接口协议-UART(一)协议基础》这一篇内容的介绍。
事实上串口实现了数据通信过程中的传输层,而应用层就系统功能的业务逻辑,应用层控制需要收发的各种数据内容。
数据解析的前提是通信双方都是用统一的数据帧格式,因此在这里将设计一个简单的起止式的数据帧格式,保证设备之间进行可靠的通信。
现在的很多无线模块,为了使用简单和易于集成,模块对外使用UART接口,并采用AT指令来完成配置和使用,常见的有ESP8266的WiFi模块、HC-05蓝牙串口模块。
AT指令的特点是易于人机交互,使用者对其发AT指令时,都是用ASCII字符发送,对于模块的处理,也是以字符来处理。这样的AT指令,它的起止式特点是以“AT”两个字符开头,并以回车换行“rn”字符结束。
HC-05蓝牙模块指令示例
但是项目工程中,数据在嵌入式设备是以HEX数据(16进制)运算和处理,如果参考AT指令去设计帧结构,那么在收发处理时候,必然要将收到的纯数据(16进制)按照字符处理。
比如一个终端设备,其功能就是环境检测,可能包含温湿度、光照强度、二氧化碳浓度、PM2.5浓度等等,如果要发出一个温度采集结果24℃数据,采集设备将数据24分成2个字节发送,因为ASCII字符’2’对应的16进制是0x32、ASCII字符’4’对应的16进制是0x34,这样的一个温度数据就需要2个字节来发送。接收端接收到的是0x32、0x34后,再以查表方式逆向换算出原温度数据’24’,这个过程就是采用字符处理的麻烦之一。
因此不考虑使用ASCII字符来组帧结构。
精简起止式结构
最简单的帧,就是有开头+结尾做起止标志。
比如0x55 + 数据包 + 0xAA。
在一长串的数据流中,接收端逐字节接收,并判断是否存在0x55,如果存在则开始存入数据包缓冲器,直到接收了0xAA数据,认为完成一帧数据的接收。
这个方法确实相当简单,不用太多的处理