12
USART1 串口协议规范
适用固件:MainController(STM32F103,Core/App)
端口:USART1,115200 8N1,DMA 收发
定位:精简协议规范(帧格式 / 字段 / 时序 / 状态机 / 错误处理),不含教程与案例。
教程与逐条案例解析见 串口指令说明书.md。
本文以固件代码为准;与源码注释冲突时以本文(代码实际)为准。
0. 概览
方向 帧 ID 名称 长度 用途
下行 host→F103 F0 06 UWB 测距 10 B 跟随数据源
下行 host→F103 FD 03 串口油门 10 B 双轮同速
下行 host→F103 FD 04 外设直控 10 B 双轮独立目标速度 + 停止模式
下行 host→F103 FD 08 在线调参 10 B 改写运行参数
上行 F103→host FD 01 速度遥测 24 B 常发 ~30 ms
上行 F103→host FD 06 速度链路诊断 24 B 调参开关开 ~12 ms
上行 F103→host FD 07 ADC→PWM 链路 24 B 调参开关开 ~6 ms
上行 F103→host FD 0B 跟随遥测 16 B 调参开关开 ~8 ms
•下行固定 10 字节;上行变长 `2 + 2×n`。两者格式不同,勿混用。
1. 物理层
项 值
波特率 115200
帧格式 8 数据位 / 无校验 / 1 停止位(8N1)
接收 DMA 环形,收满 10 字节触发一次解析(缓冲 usartrx_buf,长度 10)
发送 DMA(DMA1_Channel4),忙时丢帧(dma_tx_done==0 直接丢弃,不排队)
中断 USART1 仅使能错误中断(ERR);不使用 IDLE 中断,帧对齐由软件滑窗完成
2. 帧层总则
2.1 下行(定长 10 字节)
•上位机必须把每帧补齐到 10 字节(不足补 0x00),否则破坏 DMA 对齐、整帧丢失。
•解析器在 10 字节窗口内逐字节滑窗匹配帧头(for i=0..9,环形 %10):
◦帧可跨缓冲边界、允许任意相位错位自对齐,无需严格对齐;
◦每次回调最多解析 1 帧(命中即 break),多帧连发会按 10 字节节拍逐次解开;
◦帧头/尾匹配不完整即整帧丢弃,不影响后续帧。
2.2 上行(变长)
•通用格式:FD + 帧ID + n×int16(大端),整帧 = 2 + 2×n 字节。
•上位机必须按 2 + 2×n 收帧,不能按固定 10 字节切。
•所有 int16 由 CLAMP16 饱和到 ±32767。
2.3 字节序(方向不同,务必注意)
帧 多字节字段
F0 06 UWB(下行) 小端
FD 03 / FD 04 / FD 08(下行) 大端
FD 01/06/07/0B(上行) 大端
3. 下行帧定义
3.1 `F0 06` UWB 测距帧(小端,10 B)
偏移 长度 含义
0 1 0xF0
1 1 0x06
2–3 2 未使用
4–5 2 距离 LE16(cm)
6–7 2 角度 LE16 → int16(°,>0 = 目标在左)
8 1 未使用(RSSI)
9 1 0xAA 尾校验
•匹配条件:byte0=0xF0 && byte1=0x06 && byte9=0xAA
•命中 → 更新距离/角度并置 RangingNew=1(触发/维持跟随)
•无附加校验:距离在跟随侧再做 >0 && <8000 有效性判断;角度不校验范围
3.2 `FD 03` 串口油门帧(大端,10 B)
偏移 长度 含义
0 1 0xFD
1 1 0x03
2–3 2 A0 BE16,0~1000(前进)
4–5 2 A1 BE16,0~1000(后退)
6–9 4 填充
行为(左=右=同一目标 cs,写入 CmdSpeed,走挡位换算):
条件 cs RunFlag 持控制权
A0>0 且 A1>0 0 0(短路制动) 是
A0>0 +A0 1(前进) 是
A1>0 −A1 1(后退) 是
都 = 0 0 0 否(释放)
•量程校验:任一 >1000 → 整帧丢弃(防 0x8000 窄化变满速反转)
•超时:见 §6.3
3.3 `FD 04` 外设直控帧(大端,10 B)
偏移 长度 含义
0 1 0xFD
1 1 0x04
2–3 2 左轮目标 int16 BE,±1000(motor1)
4–5 2 右轮目标 int16 BE,±1000(motor2)
6 1 停止模式(按轮生效)
7–9 3 填充
停止模式(偏移 6,作用于该轮目标为 0 时):
值 模式 该轮行为
0 停车 三相下管全导通短路制动(默认)
1 闭环持零 闭环反向 PWM 主动压到 0
2 空挡滑行 释放功率级 → 自由滑行
•符号:+ 前进 / − 后退 / 0 停
•速度标定:1000 = 15.0 km/h;RefSpeed(0.1km/h) = v × 15 / 100,
解耦挡位/轮径(对照 FD 03/遥控/ADC 走挡位换算,同一 1000 ≈ 低/中/高档 4.0/6.0/10.6 km/h)
•量程校验:|v|>1000 → 整帧丢弃;停止模式 >2 → 回落 0(停车)
•按轮独立:一轮有目标即正常驱动,另一轮为 0 则按停止模式动作,互不影响
•超时:见 §6.3;与 FD 03 同级、后到者优先
3.4 `FD 08` 在线调参帧(大端,10 B)
偏移 长度 含义
0 1 0xFD
1 1 0x08
2 1 PARAM_ID
3–6 4 VALUE,int32 BE
7–9 3 填充
•无完整性校验:仅匹配 FD 08 两字节即写参(噪声误匹配可能误改参数,有夹紧但不可逆)
•参数无掉电保存,复位回默认值
•未知/废弃 ID 落入 default,无副作用
4. 上行帧定义
字段序号为 int16 数组下标(大端)。仅 FD 01 常发;FD 06/07/0B 仅在
TuneModeEnable=1(调参开关)时发送。
4.1 `FD 01` 速度遥测(11×int16 = 24 B,~30 ms)
# 字段 单位/说明
0 motor1.RefSpeed 0.1 km/h
1 motor2.RefSpeed 0.1 km/h
2 motor1.CmdSpeed 指令量(带符号)
3 motor2.CmdSpeed 指令量(带符号)
4 电机1 实际施加 PWM 带符号 = Pwm × (−RunDir)
5 电机2 实际施加 PWM 带符号
6 状态字 bit0=Follow, bit8=RunFlag, bit12=失速1, bit13=失速2
7 motor1.Rpm 机械转速
8 motor2.Rpm 机械转速
9 motor1.HallRaw 霍尔 3 位(bit0=U bit1=V bit2=W)
10 motor2.HallRaw 霍尔 3 位
4.2 `FD 06` 速度链路诊断(11×int16 = 24 B,~12 ms)
# 字段 说明
0 状态字 bit0=SwitchDir, bit1=DIR 引脚电平, bit8–15=KeyGetDbnc
1 motor1.RotDir 霍尔实测方向 ±1/0
2 motor2.RotDir 同上
3 状态字 bit0=RunFlag, bit1=RcActive, bit2=Follow, bit3=刹车1, bit4=刹车2
4 motor1.HallRaw 三路霍尔原始编码
5 motor2.HallRaw 同上
6 motor1.SectorCnt 原始扇区计数,30 µs/计,>33333 ≈ 霍尔丢失 1 s
7 motor2.SectorCnt 同上
8 motor1.SectorAvg 滤波后(已归一为 30 µs 计数;RPM = 22222 / x)
9 motor2.SectorAvg 同上
10 拼装字 bit0–3=CwChg1, bit4–7=CwChg2, bit8–11=HallRawPrev1, bit12–15=HallRawPrev2
4.3 `FD 07` ADC→PWM 链路 + 速度环内部量(11×int16 = 24 B,~6 ms)
# 字段 说明
0 AdcValue1 ADC 原始值
1 SpeedRun 滤波后油门
2 motor1.SpeedOut 速度环输出(±限幅)
3 motor2.SpeedOut 同上
4 状态字 bit0=RunFlag, bit1=AdcActive, bit2=SW1, bit3=SW2, bit4=刹车1, bit5=刹车2
5 motor1 z1 ×10,速度环内部量 1(0.1 km/h)
6 motor2 z1 ×10
7 motor1 z2 ×10,速度环内部量 2
8 motor2 z2 ×10
9 motor1 SpdFilt ×10,真实反馈
10 motor2 SpdFilt ×10
CmdSpeed / RefSpeed / 施加 PWM / Rpm 由 FD 01 携带,此处不重复。
4.4 `FD 0B` 跟随遥测(7×int16 = 16 B,~8 ms)
# 字段 说明
0 raw_dist 原始测距,cm × 10
1 raw_angle 原始角度,° × 10(>0 = 目标在左)
2 base 差速前进分量,0.1 km/h
3 steer 差速转向分量,0.1 km/h
4 flags bit0=Follow, bit1=RunFlag, bit2=目标有效
5 motor1.ActSpeed 0.1 km/h
6 motor2.ActSpeed 0.1 km/h
5. `FD 08` 参数表
raw = 下发值;写入前自动夹紧到范围。
ID 参数 raw 换算 夹紧范围 默认
0x04 挡位速度系数(写当前挡位) coeff × 1000 0.05 ~ 1.0 0.199 / 0.298 / 0.524
0x05 轮径 cm × 1 16 ~ 26(越界不改) 16
0x0C 失速保护阈值 30 µs 计数 × 1 ≥ 100 33333(≈1 s)
0x0D 测速保持/衰减系数 f × 100 1.0 ~ 5.0 1.5
0x10 速度反馈低通(已弃用) α × 1000 —(写入无作用) —
0x11 b0 对象增益 b0 × 1000 0.001 ~ 5.0 1.8
0x12 kp 控制器带宽 kp × 100 0.01 ~ 20 8.0
0x13 wo 观测器带宽 wo × 10 1 ~ 500 20.0
0x15 输出限幅 原值 100 ~ 999(否则 800) 800
0x18 遥控/松油门制动带宽 kp_rc × 100 0.01 ~ 20 20.0
0x1A 跟随转向速度比例 × 100 0.1 ~ 1.0 1.0
0x1B 跟随角度增益 × 100 0.1 ~ 6.0 1.5
0x1C 跟随目标距离 cm × 1 70 ~ 150 85.0
0x1D 航向 P(已弃用) × 100 0 ~ 20 —
0x20 航向 I(已弃用) × 100 0 ~ 20 —
0x22 跟随模式 kp × 100 0.01 ~ 20 5.0
已废弃 ID(落 default 丢弃,ID 不复用):
0x01 0x02 0x03 0x06 0x07 0x08 0x0B 0x0E 0x0F 0x14 0x16 0x17 0x19 0x21 0x23 0x24
6. 控制权仲裁与状态机
6.1 仲裁链(主循环每圈,自上而下命中即停)
2.4G 遥控 RcHoldCnt>0 (独占, 忽略其余)
↓ 否则
UWB 跟随 FollowActive || RangingNew
↓ 否则
串口指令 FD 03 / FD 04 (同级, 后到者优先, 200 ms 窗口)
↓ 返回 0 且 !RcActive
本地 ADC 油门
层级 进入条件 备注
2.4G 遥控 RcHoldCnt>0 遥控帧刷新 RcHoldCnt=3000(90 ms);独占
UWB 跟随 FollowActive 或本圈有 RangingNew FollowCtrl() 接管
串口 FD 03/FD 04 有新鲜帧 两帧共享 200 ms 窗口,谁的新帧更近谁定模式
本地 ADC 串口级返回 0 且 RcActive==0 RcActive 为遥控存活窗口(150 ms),防遥控帧间隙误切 ADC
6.2 跟随状态机(`FollowCtrl` + `FollowTimeoutCheck`)
收到有效帧 (dist∈(0,8000)) ──→ 更新距离/角度, 刷新时间戳 RangingLastCnt
│
├─ dist ≥ 350cm → 退出跟随, 停车 (FollowActive=0)
├─ dist < 60cm → 退出跟随, 停车 (FollowActive=0, 防撞)
└─ 60 ≤ dist < 350 → 正常跟随:
· dist > 目标距离(85cm) : 前进 + 转向 (Stanley: 航向项 + 横向项 + ff)
· dist ≤ 目标距离 : 转向对齐/原地 pivot
· 均置 FollowActive=1 (独占, 阻挡手动/串口/ADC)
掉帧 (无有效帧) 按经过时间:
< 200 ms → 保持上次指令 (骑过瞬时丢帧)
200~400 ms → 递减至 0 (保持转向/曲率平滑减速; 每 30ms tick 按比例乘一次, 乘法累积略快于线性)
≥ 400 ms → 停车, 但 FollowActive 仍=1 继续阻挡手动
> 1 s → FollowTimeoutCheck 释放 FollowActive, 交还手动 (停车)
•跟随决策层 base/steer 按低档物理标定,写 CmdSpeed 时乘 wk_ref/wk 解耦挡位(各挡物理速度/差速一致)
•失联/退出/停车/超时均复位决策状态(平滑、目标运动前馈、est_valid),防止重新进入瞬间用陈旧值猛冲
•掉帧衰减分支与正常帧分支采用同一挡位解耦系数
6.3 超时/节拍表
项 时长 单位换算 行为
遥控帧保持 RcHoldCnt 90 ms 3000 × 30 µs 遥控有效窗口;递减,帧刷新
遥控存活窗口 RcActive 150 ms 75 × 2 ms 遥控帧间隙内维持,防误切 ADC
串口超时 200 ms 6666 × 30 µs FD 03/FD 04 共用;超时释放控制权
跟随掉帧保持 200 ms — 骑过瞬时丢帧
跟随掉帧停车 400 ms — 衰减到 0 后停车
跟随总超时 1 s 33333 × 30 µs 释放 FollowActive
串口接收 — 10 B DMA 环形,满 10 字节解析 1 帧
FD 01 常发 ~30 ms 1000 × 30 µs 不受开关限制
FD 06 ~12 ms 400 × 30 µs 仅调参开关
FD 07 ~6 ms 200 × 30 µs 仅调参开关
FD 0B ~8 ms 267 × 30 µs 仅调参开关
7. 错误处理与鲁棒性
场景 处理
下行不足 10 字节 破坏 DMA 对齐 → 丢帧/错帧。必须补齐 10 B
下行超范围(FD 03 任一>1000、FD 04 ` v
FD 04 停止模式 >2 回落 0(停车,最安全)
FD 08 未知/废弃 ID default 丢弃,无副作用
帧错位/跨边界 滑窗 %10 自对齐,正常解析
UART 溢出/帧错误 CommUartErrorRecover:清 ORE/FE/NE + 读 DR + 重启 DMA 接收
上行 DMA 忙 本帧丢弃(不排队),下一节拍重发
参数失电 无掉电保存,复位回默认
已知薄弱点(协议层面):
1.FD 08 仅匹配 2 字节即写参,无完整性校验——调参务必在停车、安静链路下进行
2.F0 06 角度无范围校验(距离在跟随侧校验),噪声误配可能给出离谱角度
3.FD 08 写入的参数不可逆(无读回、无掉电保存)
8. 附录:常量与单位速查
量 单位 备注
CmdSpeed 指令量(带符号) 油门/直控指令域
FD 04 目标 ±1000 → ±15.0 km/h 固定比例,解耦挡位/轮径
RefSpeed / ActSpeed 0.1 km/h 速度环目标 / 实测
SpeedOut 同 CmdSpeed 域(±限幅) 速度环输出
Rpm rpm 22222 / SectorCnt
时间戳 RangingTimer 30 µs / 计 全部节拍/超时均以此为基准
WheelSize cm 默认 16
GearCoef ×1000 低/中/高 = 0.199 / 0.298 / 0.524
TpFollowDist cm 默认 85,FD 08 0x1C 可调
跟随距离窗 cm (60, 350):<60 退出、≥350 停车
实现注意(上位机侧)
1.下行必须补齐 10 字节(FD 03/04/08 多发 7/8 字节会丢帧)
2.字节序:F0 06 小端,其余下行/上行大端
3.帧 ID 一字之差即整帧丢弃(FD 03 ≠ FD 04 ≠ FD 08)
4.上行帧变长,按 2 + 2×n 收帧
5.FD 04 固件 200 ms 无帧即释放 → 直控须周期重发(建议 100 ms)
6.FD 08 无校验、无掉电保存,调参建议停车进行