跳转至

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 操作步骤

  1. 只接收不发送,保存至少 5 秒原始十六进制数据。
  2. 从 0x7B 开始按固定长度截帧,再确认末尾 0x7D。
  3. 对上行前 22 个字节计算异或值,与第 22 号字节比较。
  4. 将 MSB/LSB 组合为有符号 16 位值。静止时三轴速度应接近 0,电池字段应与显示趋势一致。
  5. 构造全零速度下行帧,先在电机失能状态发送,确认 OLED 或调试状态进入串口控制模式。
  6. 构造很小的正 X 速度,重新计算 BCC;使能后短时发送并立即发零速帧。
  7. 抓取 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 串口端口、权限、参数或发布链路问题

章节导航

上一章:键盘与 ROS 2 速度控制 · 返回本篇 · 下一章:CAN 通信协议