嵌入式开发之串行数据处理

前题

前面几篇文章写了关于嵌入式软件开发时,关于串行数据处理的一些相关内容,有兴趣的可以看看《嵌入式开发:软件架构、驱动开发与串行数据处理》、《嵌入式软件开发之生产关系模型》和《嵌入式开发之Modbus-RTU协议解析》相关的内容。从业十几年,深刻感觉到在当前计算机和单片机的架构下,处理好串行数据,将大大提升软件运行的稳定性。

概述

在物联网设备开发过程中,我们可以发现不管是采集传感器数据,还是和服务器进行通讯,涉及到交互的地方,设备间的数据都是以串行的方式进行交互的。下面以读取Modbus-RTU传感器的数据为例,报文格式如下:

设备处理器以MCU为例,基于RS485总线进行交互,设备会将打包好的数据放入UART的发送寄存器,一次发送一个字节,首先发送0x01,然后依次发送完成这8个字节的数据,现在应用中一般是轮询发送(有数据发送时不停判断发送寄存器是否为空,为空时将要发送的数据继续放入,直到所有数据都发送完),中断接收(当接收完一个字节数据时产生中断,应用程序将接收寄存器中的数据保存下来)。发送的过程中有可能被中断,也有可能被干扰,数据有可能会产生错误码。发送时串口是轮询模式,相当于独占了MCU的资源,如果RAM足够大的话也可以采用中断发送的模式,创建一个发送的环形队列,需要发送的数据放入环形队列后,触发发送中断,发送完成后如果队列中还有数据就继续发送并触发中断,直到最后一个数据发送完成,这个在这里不展开讲了,这里只说处理数据的过程。

接收数据也是在初始化串口时候创建了一个环形队列,产生接收中断时就将数据放入环形队列中,这里也多说一句,老工程师在写代码时,经常就是一个buf存放数据,在中断中判断超时,如果超时了就从中断中推出来,然后去解析buf里的数据,以前的设备处理的功能比较简单,功能也比较单一,这么做不会影响啥,但是现在的设备串口上挂着很多设备,比如我们的产品,有一个串口挂着蓝牙通信,一个串口挂着4G通信,一个串口挂着串口屏,再加上这个挂传感器的串口,如果一个串口停在中断里,其它的串口都有可能会丢数,问题会比较严重。

串口中断只负责接收数据,相当于这个系统的数据生产者,它不管其他模块去怎么消费这些数据。

创建一个任务,间隔性的查询环形队列里是否有数据,满足最小报文的长度,当满足报文长度时开始解析,解析时如果队列前面有无效字节,需要删除无效字节数,然后解析出完整的报文,并将完整的报文提取后进行处理,等下一个周期再去检查是否接收了完整的数据包,环形队列的长度一般要能够满足两三条报文的长度,这样避免粘包出现时,新数据将老数据冲掉。

解析串行数据需要考虑断包,粘包,校验错误等问题。在利用生产关系模型将其结构化后,这些问题会很好解决。

串行数据开始解析时,先从缓存中预提取一定长度数据出来,然后开始找报文头,确定报文头后就可以将报文头前面无效字节删除,然后提取报文长度,计算报文校验,这里比较关键如果报文长度有问题时,比如长度非法或者长度不够一包数据时,如何处理?长度非法的情况下需要删掉报文头一个字节,重新开始查找报文头。如果报文长度不够,就不做任何处理,退出循环,再次判断环形队列的长度,待长度满足最小报文长度时继续解析处理。以此类推,解析数据不一定要在一个循环里完成,要考虑在多次循环重入时怎么解决问题。这样做的另外一个好处就是会增强系统的实时性,尽量缩短单次循环处理数据的周期,能让大循环的周期尽量的短。

下面提供一组环形队列处理的接口定义,仅供参考,有兴趣可以发邮件或者留言交流一下:

复制代码
int32_t fifo_init(fifo_t *pfifo,uint8_t *buf,uint32_t size);
int32_t fifo_get_free_size(fifo_t *pfifo);
int32_t fifo_get_data_size(fifo_t *pfifo);
int32_t fifo_del_data(fifo_t *pfifo,uint32_t size);
int32_t fifo_read(fifo_t *pfifo,uint8_t *buf,uint32_t len);
int32_t fifo_pre_read(fifo_t *pfifo,uint8_t *buf,uint32_t len);
int32_t fifo_write(fifo_t *pfifo,const uint8_t *buf,uint32_t len);
相关推荐
檀越剑指大厂14 分钟前
STM32 搭配 嵌入式SD卡在智能皮电手环中的应用全景评测
stm32·单片机·嵌入式硬件
TDengine (老段)1 小时前
TDengine 运维——巡检工具(安装前检查)
大数据·运维·数据库·物联网·时序数据库·tdengine·涛思数据
广药门徒1 小时前
STM32程序运行不了,仿真功能也异常,连断点和复位都异常了
stm32·单片机·嵌入式硬件
努力学习的小廉7 小时前
深入了解linux系统—— 库的制作和使用
linux·运维·单片机
淘晶驰AK10 小时前
电机控制选 STM32 还是 DSP?技术选型背后的现实博弈
stm32·单片机·嵌入式硬件
Fxrain11 小时前
[嵌入式实验]实验二:LED控制
stm32·单片机·嵌入式硬件
~夕上林~12 小时前
单片机——keil5
单片机·嵌入式硬件
电子科技圈13 小时前
XMOS以全新智能音频及边缘AI技术亮相广州国际专业灯光音响展
人工智能·嵌入式硬件·mcu·物联网·自然语言处理·音视频·边缘计算
promising-w14 小时前
【stm32开发板】原理图设计(电源部分)附:设计PCB流程
stm32·单片机·嵌入式硬件
华清远见IT开放实验室14 小时前
华清远见亮相第63届高博会,展示AI/嵌入式/物联网/具身智能全栈教学解决方案
物联网·嵌入式·硬件·具身智能·虚拟仿真·ai人工智能