USART1 串口协议规范

适用固件:MainController(STM32F103,Core/App)

端口:USART1,115200 8N1,DMA 收发

定位:精简协议规范(帧格式 / 字段 / 时序 / 状态机 / 错误处理),不含教程与案例。

教程与逐条案例解析见 串口指令说明书.md。

本文以固件代码为准;与源码注释冲突时以本文(代码实际)为准。

0. 概览

方向帧 ID名称长度用途
下行 host→F103F0 06UWB 测距10 B跟随数据源
下行 host→F103FD 03串口油门10 B双轮同速
下行 host→F103FD 04外设直控10 B双轮独立目标速度 + 停止模式
下行 host→F103FD 08在线调参10 B改写运行参数
上行 F103→hostFD 01速度遥测24 B常发 ~30 ms
上行 F103→hostFD 06速度链路诊断24 B调参开关开 ~12 ms
上行 F103→hostFD 07ADC→PWM 链路24 B调参开关开 ~6 ms
上行 F103→hostFD 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)

偏移长度含义
010xF0
110x06
2–32未使用
4–52距离 LE16(cm)
6–72角度 LE16 → int16(°,>0 = 目标在左)
81未使用(RSSI)
910xAA 尾校验

• 匹配条件:byte0=0xF0 && byte1=0x06 && byte9=0xAA

• 命中 → 更新距离/角度并置 RangingNew=1(触发/维持跟随)

• 无附加校验:距离在跟随侧再做 >0 && <8000 有效性判断;角度不校验范围

3.2 `FD 03` 串口油门帧(大端,10 B)

偏移长度含义
010xFD
110x03
2–32A0 BE16,0~1000(前进)
4–52A1 BE16,0~1000(后退)
6–94填充

行为(左=右=同一目标 cs,写入 CmdSpeed,走挡位换算):

条件csRunFlag持控制权
A0>0 且 A1>000(短路制动)是
A0>0+A01(前进)是
A1>0−A11(后退)是
都 = 000否(释放)

• 量程校验:任一 >1000 → 整帧丢弃(防 0x8000 窄化变满速反转)

• 超时:见 §6.3

3.3 `FD 04` 外设直控帧(大端,10 B)

偏移长度含义
010xFD
110x04
2–32左轮目标 int16 BE,±1000(motor1)
4–52右轮目标 int16 BE,±1000(motor2)
61停止模式(按轮生效)
7–93填充

停止模式(偏移 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)

偏移长度含义
010xFD
110x08
21PARAM_ID
3–64VALUE,int32 BE
7–93填充

• 无完整性校验:仅匹配 FD 08 两字节即写参(噪声误匹配可能误改参数,有夹紧但不可逆)

• 参数无掉电保存,复位回默认值

• 未知/废弃 ID 落入 default,无副作用

4. 上行帧定义

字段序号为 int16 数组下标(大端)。仅 FD 01 常发;FD 06/07/0B 仅在

TuneModeEnable=1(调参开关)时发送。

4.1 `FD 01` 速度遥测(11×int16 = 24 B,~30 ms)

#字段单位/说明
0motor1.RefSpeed0.1 km/h
1motor2.RefSpeed0.1 km/h
2motor1.CmdSpeed指令量(带符号)
3motor2.CmdSpeed指令量(带符号)
4电机1 实际施加 PWM带符号 = Pwm × (−RunDir)
5电机2 实际施加 PWM带符号
6状态字bit0=Follow, bit8=RunFlag, bit12=失速1, bit13=失速2
7motor1.Rpm机械转速
8motor2.Rpm机械转速
9motor1.HallRaw霍尔 3 位(bit0=U bit1=V bit2=W)
10motor2.HallRaw霍尔 3 位

4.2 `FD 06` 速度链路诊断(11×int16 = 24 B,~12 ms)

#字段说明
0状态字bit0=SwitchDir, bit1=DIR 引脚电平, bit8–15=KeyGetDbnc
1motor1.RotDir霍尔实测方向 ±1/0
2motor2.RotDir同上
3状态字bit0=RunFlag, bit1=RcActive, bit2=Follow, bit3=刹车1, bit4=刹车2
4motor1.HallRaw三路霍尔原始编码
5motor2.HallRaw同上
6motor1.SectorCnt原始扇区计数,30 µs/计,>33333 ≈ 霍尔丢失 1 s
7motor2.SectorCnt同上
8motor1.SectorAvg滤波后(已归一为 30 µs 计数;RPM = 22222 / x)
9motor2.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)

#字段说明
0AdcValue1ADC 原始值
1SpeedRun滤波后油门
2motor1.SpeedOut速度环输出(±限幅)
3motor2.SpeedOut同上
4状态字bit0=RunFlag, bit1=AdcActive, bit2=SW1, bit3=SW2, bit4=刹车1, bit5=刹车2
5motor1 z1×10,速度环内部量 1(0.1 km/h)
6motor2 z1×10
7motor1 z2×10,速度环内部量 2
8motor2 z2×10
9motor1 SpdFilt×10,真实反馈
10motor2 SpdFilt×10

CmdSpeed / RefSpeed / 施加 PWM / Rpm 由 FD 01 携带,此处不重复。

4.4 `FD 0B` 跟随遥测(7×int16 = 16 B,~8 ms)

#字段说明
0raw_dist原始测距,cm × 10
1raw_angle原始角度,° × 10(>0 = 目标在左)
2base差速前进分量,0.1 km/h
3steer差速转向分量,0.1 km/h
4flagsbit0=Follow, bit1=RunFlag, bit2=目标有效
5motor1.ActSpeed0.1 km/h
6motor2.ActSpeed0.1 km/h

5. `FD 08` 参数表

raw = 下发值;写入前自动夹紧到范围。

ID参数raw 换算夹紧范围默认
0x04挡位速度系数(写当前挡位)coeff × 10000.05 ~ 1.00.199 / 0.298 / 0.524
0x05轮径cm × 116 ~ 26(越界不改)16
0x0C失速保护阈值30 µs 计数 × 1≥ 10033333(≈1 s)
0x0D测速保持/衰减系数f × 1001.0 ~ 5.01.5
0x10速度反馈低通(已弃用)α × 1000—(写入无作用)—
0x11b0 对象增益b0 × 10000.001 ~ 5.01.8
0x12kp 控制器带宽kp × 1000.01 ~ 208.0
0x13wo 观测器带宽wo × 101 ~ 50020.0
0x15输出限幅原值100 ~ 999(否则 800)800
0x18遥控/松油门制动带宽 kp_rc× 1000.01 ~ 2020.0
0x1A跟随转向速度比例× 1000.1 ~ 1.01.0
0x1B跟随角度增益× 1000.1 ~ 6.01.5
0x1C跟随目标距离cm × 170 ~ 15085.0
0x1D航向 P(已弃用)× 1000 ~ 20—
0x20航向 I(已弃用)× 1000 ~ 20—
0x22跟随模式 kp× 1000.01 ~ 205.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 或本圈有 RangingNewFollowCtrl() 接管
串口FD 03/FD 04 有新鲜帧两帧共享 200 ms 窗口,谁的新帧更近谁定模式
本地 ADC串口级返回 0 且 RcActive==0RcActive 为遥控存活窗口(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 超时/节拍表

项时长单位换算行为
遥控帧保持 RcHoldCnt90 ms3000 × 30 µs遥控有效窗口;递减,帧刷新
遥控存活窗口 RcActive150 ms75 × 2 ms遥控帧间隙内维持,防误切 ADC
串口超时200 ms6666 × 30 µsFD 03/FD 04 共用;超时释放控制权
跟随掉帧保持200 ms—骑过瞬时丢帧
跟随掉帧停车400 ms—衰减到 0 后停车
跟随总超时1 s33333 × 30 µs释放 FollowActive
串口接收—10 BDMA 环形,满 10 字节解析 1 帧
FD 01 常发~30 ms1000 × 30 µs不受开关限制
FD 06~12 ms400 × 30 µs仅调参开关
FD 07~6 ms200 × 30 µs仅调参开关
FD 0B~8 ms267 × 30 µs仅调参开关

7. 错误处理与鲁棒性

场景处理
下行不足 10 字节破坏 DMA 对齐 → 丢帧/错帧。必须补齐 10 B
下行超范围(FD 03 任一>1000、FD 04 `v
FD 04 停止模式 >2回落 0(停车,最安全)
FD 08 未知/废弃 IDdefault 丢弃,无副作用
帧错位/跨边界滑窗 %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 / ActSpeed0.1 km/h速度环目标 / 实测
SpeedOut同 CmdSpeed 域(±限幅)速度环输出
Rpmrpm22222 / SectorCnt
时间戳 RangingTimer30 µs / 计全部节拍/超时均以此为基准
WheelSizecm默认 16
GearCoef×1000低/中/高 = 0.199 / 0.298 / 0.524
TpFollowDistcm默认 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 无校验、无掉电保存,调参建议停车进行