18. 串口通信协议¶
18.1 学习目标¶
能从原始字节流中找到完整帧,解析上下行速度与状态,并用校验结果判断一帧数据是否可信。本文以 0x7B/0x7D 协议为例;改代码前仍要核对实机固件版本。
18.2 适用范围¶
适用于使用 24 字节上行、11 字节下行串口帧的教育和大型科研底盘。S 系列或新版固件若协议不同,以对应手册和源码为准。
18.3 操作前检查¶
- 先记录串口设备、波特率、数据位、停止位和校验设置。
- 初次发送控制帧时关闭底盘使能或架空轮子。
- 串口助手必须使用十六进制收发,不能把字节串当文本发送。
18.4 工作原理¶
串口或串行端口在同一对设备之间按顺序传输字节。它不像网络协议那样自动区分每条消息,因此接收端需要靠帧头、长度、帧尾和校验把连续字节流还原成一帧命令或状态。
“上行”以底盘为参照,表示底盘向主控发送状态;“下行”表示底盘接收控制命令。
上行帧长 24 字节:帧头 0x7B、使能标志、三轴速度、三轴加速度、三轴角速度、电池电压、BCC和帧尾 0x7D。多字节整数按高位字节(Most Significant Byte, MSB)在前、低位字节(Least Significant Byte, LSB)在后组成有符号 16 位数。
下行帧长 11 字节:
| 字节 | 内容 |
|---|---|
| 0 | 0x7B 帧头 |
| 1–2 | 预留 |
| 3–4 | X 目标速度,mm/s,MSB/LSB |
| 5–6 | Y 目标速度,mm/s,MSB/LSB |
| 7–8 | Z 目标角速度乘 1000,MSB/LSB |
| 9 | 前 9 字节的 BCC 异或校验 |
| 10 | 0x7D 帧尾 |
BCC 是参与校验字节的逐字节异或。帧头、长度和帧尾正确但 BCC 不符时,这帧仍应丢弃。
18.5 操作步骤¶
- 只接收不发送,保存至少 5 秒原始十六进制数据。
- 从
0x7B开始按固定长度截帧,再确认末尾0x7D。 - 对上行前 22 个字节计算异或值,与第 22 号字节比较。
- 将 MSB/LSB 组合为有符号 16 位值。静止时三轴速度应接近 0,电池字段应与显示趋势一致。
- 构造全零速度下行帧,先在电机失能状态发送,确认 OLED 或调试状态进入串口控制模式。
- 构造很小的正 X 速度,重新计算 BCC;使能后短时发送并立即发零速帧。
- 抓取 ROS 驱动发出的字节,与手工帧比较单位、符号和发送频率。
Python 中的有符号 16 位组合示例:
value = int.from_bytes(bytes([msb, lsb]), byteorder="big", signed=True)
BCC 示例:
checksum = 0
for byte in frame_without_checksum_and_tail:
checksum ^= byte
18.6 验收标准¶
- 能从连续字节流稳定分出多帧。
- 上行校验、帧头和帧尾一致。
- 静止、前进、后退和转向时,速度字段的符号变化合理。
- 零速下行能可靠停止,低速命令与 OLED/轮子响应一致。
- 串口工具与 ROS 驱动使用同一单位和字节序。
18.7 故障排查¶
| 现象 | 原因 |
|---|---|
完全看不到 0x7B |
波特率、端口、线缆或协议版本错误 |
| 帧长度不断漂移 | 丢字节、错误截帧或文本/十六进制模式混用 |
| 正负数异常 | 有符号解析或 MSB/LSB 顺序错误 |
| 校验始终不符 | 参与异或的字节范围错误 |
| 速度大 1000 倍 | 角速度缩放或 mm/s 与 m/s 转换遗漏 |
| 手工帧能动,ROS 不能动 | ROS 串口端口、权限、参数或发布链路问题 |