AIGC标识 大话串口:自定义协议帧,解决多设备通信的 “万金油”

串口深度解析:面向多设备通信的自定义帧

本教程讲解 UART 异步串口通信、帧结构、奇偶校验、波特率相关概念以及数据传输工作流程。
cover56.png

1. 基础概念

思考以下应用场景:

  • 接收端需要接收可变长度的数据
  • 发送端会不定时发送不同类型的数据(例如三轴陀螺仪发送 X、Y、Z 三个方向的角度、角速度、加速度信息)
  • 多个设备挂载在同一总线(例如 RS485)上,如何判断接收到的数据是发给哪台设备

可以看到,面对以上场景时,串口通信中需要携带更多信息,例如传输的数据类型、数据长度、目标接收设备编号等。这时,我们可以在发送设备与接收设备之间使用​自定义串口通信协议帧​。简单来说,就是将串口通信中传输的若干数据包组装成一帧数据。不同传输顺序的数据包代表不同含义(例如,第三个传输数据包的有效数据位代表目标接收设备的设备号等)。接收设备通过解析由多个数据包组成的数据帧,就可以准确无误地获取所需数据。
1043332475_1785761887.png

串口通信层级示意图
1043332475_1785761958.png

2. 自定义协议帧格式

自定义协议帧一般由以下部分组成:帧头、帧尾、地址信息、数据类型、数据长度、数据块、校验码等。自定义协议帧的通用格式如下:
1043332475_1785761969.png

3. 自定义协议的组包与解包

组包(打包)指在待发送数据的首尾添加标识(如帧头、设备地址、命令、命令类型、数据长度、帧尾、校验码等);解包则是从接收到的数据帧中剔除有效数据以外的部分,提取出原始发送数据。

数据解包的常规流程如下:
d2544538b9e1f39ee2fbc877bd26bb31.png
cdfaf291e155504c3077c2d23da42639.png

收到数据帧的每个数据包后,都需要做校验:

收到第一个字节数据时,判断是否为帧头;如果是帧头,则继续接收下一个数据,同时置位帧头接收完成标志,并将帧头存入预先定义的列表或其他数据结构做缓存,方便接收完毕后对数据做后续处理;如果不是帧头,则不置位帧头接收完成标志,继续判断下一个收到的数据是否为帧头。

接收功能码(即设备地址、命令类型、指令等)时流程同上:首先判断该数据是否处于功能码预设参数范围内,也就是入参校验(举例:命令仅有 0x510x520x53 这三类,需要判断收到的命令是否为其中之一)。如果该数据属于功能码预设参数范围,则置位功能码接收完成标志,并存入缓存数据结构;否则,重新从帧头开始接收。

这里需要特别注意:针对数据长度功能码,必须判断数据长度的取值范围。否则,如果数据长度接收出错,会引发内存溢出问题(例如接收到的数据长度超出预设列表的最大存储空间)。

全部校验通过后,从缓存数据结构中提取数据与指令,再依据提取到的数据和指令执行后续业务操作。

posted @ 2026-08-31 11:30  FreakStudio  阅读(6)  评论(0)    收藏  举报