米乐M6官网登录正版下载·嵌入式硬件通讯接口协议-UART(四)规划起止式的应用层协议 软件处批量订制
57
串口完结了两个终端设备之间进行牢靠的通讯,串口在这中心完结了传输层的效果。本次要讲的是关于数据的协议。 在战役体裁影视剧中常常可以看到这样的对白,在经过对讲机等相关无线设备呼叫队友时,先呼叫对方称号,然后奉告自己身份,说完内容最终再说over,表明一次呼叫完毕。 UART的时序自身便是起止式协议,详细可参阅《嵌入式硬件通讯接口协议-UART(一)协议根底》这一篇内容的介绍。 事实上串口完结了数据通讯进程中的传输层,而应用层就体系功用的事务逻辑,应用层操控需求收发的各种数据内容。 数据解析的条件是通讯两边都是用一致的数据帧格局,因而在这儿将规划一个简略的起止式的数据帧格局,确保设备之间进行牢靠的通讯。 现在的许多无线模块,为了运用简略和易于集成,模块对外运用UART接口,并选用AT指令来完结装备和运用,常见的有ESP8266的WiFi模块、HC-05蓝牙串口模块。 AT指令的特色是易于人机交互,运用者对其发AT指令时,都是用ASCII字符发送,关于模块的处理,也是以字符来处理。这样的AT指令,它的起止式特色是以“AT”两个字符最初,并以回车换行“”字符完毕。 可是项目工程中,数据在嵌入式设备是以HEX数据(16进制)运算和处理,假如参阅AT指令去规划帧结构,那么在收发处理时分,必定要将收到的纯数据(16进制)依照字符处理。 比方一个终端设备,其功用便是环境检测,或许包括温湿度、光照强度、二氧化碳浓度、PM2.5浓度等等,假如要宣布一个温度收集成果24℃数据,收集设备将数据24分红2个字节发送,由于ASCII字符’2’对应的16进制是0x32、ASCII字符’4’对应的16进制是0x34,这样的一个温度数据就需求2个字节来发送。接纳端接纳到的是0x32、0x34后,再以查表方法逆向换算出原温度数据’24’,这个进程便是选用字符处理的费事之一。 在一长串的数据流中,接纳端逐字节接纳,并判别是否存在0x55,假如存在则开端存入数据包缓冲器,直到接纳了0xAA数据,以为完结一帧数据的接纳。 而这样存在很大的问题,假如传输的内容也有0xAA这样的数据,这个0xAA并非结束标志,而程序接纳进程就提前完毕,这样就不能确保完好接纳一帧数据包了。 这样一来,接纳端判别接纳到了0x55的最初标志,紧接着再接纳一个“长度”的字节,根据这个长度来持续接纳后续剩下的数据。 这样的接口,即便有最初、长度、结束,还存在危险。比方传输数据时,物理线路遭到不知道搅扰,导致数据内容呈现了反常,那么接纳端即便完好接纳一切数量的数据下来,也是过错的内容。 处理在发送进程中呈现的不知道过错问题,必定需求对数据进行校验。再添加一字段来标志数据内容的校验核算成果。 校验值是对数据包选用算法核算而得,接纳方完好收下一切数量的数据,再对数据包选用相同的算法核算出校验值,然后比照校验值来确认数据包的准确性。 0x55二进制是01010101,这样在UART物理线路上输出的信号将会是占空比50%的方波,方波是最简单进行丈量和确诊的,在实践波形观测时可以确认稳定性、噪声毛刺等。 要说0xAA(二进制10101010)也是可以,可是UART发送时分是有一个开始位0,而且是以LSB方法先发送bit0的最低位,0xAA的bit0已经是0,而0x55的bit0是1,因而想得到方波当然优先考虑用0x55。 packet数据包最大长度设为253,是由于len是uint8_t类型,len最大255,而CRC校验值占了2个字节,因而packet数据包最多可253个字节。 CRC校验值选用的是CRC-16规范,校验值是个uint16_t类型的数据,传输时选用的是LSB形式,因而将CRC校验值设为两个uint8_t类型的数据,这样做便于在源码移植进程中,不同渠道的巨细端差异可以得到正确处理。 核算后得到某一次的校验值成果是 0xDC66,这是一个uint16_t类型的数据,假如直接运用这个结构体来处理数据发送,那么: 因而选用2个字节uint8_t数据类型替代uint16_t来界说结构体中的CRC校验值,使得在跨渠道收发数据时无需做差异化处理。 运用起止式进行数据传输时,把应用层的数据包进行组帧,这样可结构一个完好的数据帧,便于在应用层将完好的一帧数据传递给传输层宣布。 为了避免应用层调用接口时,传进来的数据包的地址、组帧成果的首地址指向同一个内存地址,所以在组帧前需求将源数据内容独自缓存,再进行“填充”的操作。 这儿被解析的数据来历是一个循环缓冲区,对循环缓冲区内的可读数据进行解析。因而需求运用循环缓冲区合作。 米乐M6官网登录正版下载 上一篇:人性化安在!DIY硬件十大最坑人规划(组图) 下一篇:疆土空间规划“一张图”施行监督等信息系统建造(接口开发及硬件收购部分)项目投标公 |