1. USART串口数据包概述
在嵌入式系统的串口通信中,USART外设仅负责字节级的数据收发。它能够按照设定的波特率正确发送和接收单个字节,但无法理解这些字节在应用层的具体含义。然而实际工程中,串口传输的数据通常是一组具有明确逻辑关系的字节序列。
1.1 数据包的必要性
如果仅按字节顺序单向发送数据,接收端会面临三个关键问题:
- 边界模糊:无法确定一帧有效数据的起始和结束位置
- 语义混乱:难以判断当前字节属于哪条指令的哪个参数
- 完整性存疑:无法检测传输过程中是否发生位翻转或数据丢失
1.2 数据包的基本结构
为解决上述问题,工程实践中通常采用数据包(Data Packet)的概念。一个典型的数据包包含以下部分:
| 协议字段 | 核心作用 | 工程备注 |
|---|---|---|
| 包头 | 标识数据帧开始 | 常选用0xFF等特殊字节 |
| 数据载荷 | 实际传输的数据 | 传感器数值或控制指令等 |
| 校验位 | 检测数据正确性 | 可选,用于识别传输干扰 |
| 包尾 | 标识数据帧结束 | 与包头配合确定边界 |
注意:数据包协议并非固定标准,开发者可根据应用场景和可靠性需求自由设计协议规约。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 串口数据包协议设计
2.1 数据包基本类型
2.1.1 定长数据包
定长数据包每帧长度固定,接收端检测到包头后接收固定数量字节即可确定帧结束。
特点:
- 优点:协议简单,接收逻辑清晰,状态机实现容易
- 缺点:数据结构必须固定,不够灵活,字节丢失可能导致后续解析错位
适用场景:数据结构稳定、字段固定的周期性数据传输。
2.1.2 变长数据包
变长数据包每帧长度不固定,需通过额外协议字段确定帧结束位置。
常见方式:
- 包头+包尾
- 包头+长度字段
- 结束符
特点:
- 优点:灵活性高,可传输任意长度数据,协议扩展方便
- 缺点:接收逻辑复杂,状态机设计要求高
适用场景:上位机通信协议或命令控制协议。
2.2 载荷与控制字冲突问题
当载荷数据中的字节与协议控制字取值相同时,会导致解析错误。解决方案包括:
