refactor(protocol): 新增 comm_protocol 协议收发解析层,ble_transport 退化为纯传输

- 删除 protocol.h,帧定义和标定命令码统一迁入 comm_protocol.h
- 新增 comm_protocol.c:上行组包(CoP/标定响应)、下行解析+msgq 分发
- ble_transport 剥离所有协议解析和参数 getter,仅保留字节收发+rx 回调注册
- main.c 初始化顺序:ble_transport → comm_protocol → adv_start → cal_init
- 更新 README 架构图和项目结构表,补充标定流程章节
- 更新 BALANCE_BOARD_PROTOCOL.md 增加标定命令/响应帧格式文档
This commit is contained in:
2026-05-15 18:06:33 +08:00
parent 1a65bf0f22
commit 0979866a7c
8 changed files with 627 additions and 329 deletions
+99 -1
View File
@@ -36,6 +36,8 @@
| `PROTO_TYPE_RESISTANCE` | `0x10` | 基站 -> 平衡板 | `16` | 按需 | 阻力参数帧 |
| `PROTO_TYPE_SPOTTER` | `0x11` | 基站 -> 平衡板 | `9` | 按需 | 保护模式帧 |
| `PROTO_TYPE_HEARTBEAT` | `0x20` | 基站 -> 平衡板 | `5` | ~1 Hz | 心跳帧 |
| `PROTO_TYPE_CAL_CMD` | `0x30` | 基站 -> 平衡板 | `10` | 按需 | 标定命令帧 |
| `PROTO_TYPE_CAL_RESP` | `0x31` | 平衡板 -> 基站 | `14` | 按需 | 标定响应帧 |
## 3. 上行数据包
@@ -194,7 +196,103 @@ AA 55 20 05 XX
含义:心跳包,计数 `5``XX` 为 CRC。
## 5. 当前实现约束
## 5. 标定协议
标定协议通过下行标定命令帧(`0x30`)和上行标定响应帧(`0x31`)完成传感器在线标定。标定分两级:L1 单通道零点/增益标定,L2 多点网格空间修正。
### 5.1 标定命令帧(下行)
标定命令帧固定 10 字节,由基站发送给平衡板:
| 字节偏移 | 字段 | 类型 | 值/范围 | 说明 |
|----------|------|------|---------|------|
| `0` | `sync0` | `uint8` | `0xAA` | 帧头第 1 字节 |
| `1` | `sync1` | `uint8` | `0x55` | 帧头第 2 字节 |
| `2` | `type` | `uint8` | `0x30` | 标定命令包类型 |
| `3` | `subcmd` | `uint8` | 见下表 | 子命令码 |
| `4` | `target` | `uint8` | `0-3` / `0-8` | 通道号或网格点号 |
| `5-8` | `param` | `float32 LE` | - | 参数(如已知质量 kg) |
| `9` | `crc` | `uint8` | - | CRC-8/MAXIM 校验 |
#### `subcmd` 子命令码定义
| 子命令码 | 名称 | target 含义 | param 含义 | 说明 |
|----------|------|-------------|------------|------|
| `0x01` | `START_L1` | - | - | 进入 L1 标定模式 |
| `0x02` | `TARE_CH` | 通道号 (0-3) | - | 对指定通道执行零点标定 |
| `0x03` | `GAIN_CH` | 通道号 (0-3) | 已知质量 (kg) | 对指定通道执行增益标定 |
| `0x04` | `COMMIT_L1` | - | - | 提交 L1 标定数据到 NVS |
| `0x05` | `ABORT` | - | - | 中止当前标定流程 |
| `0x10` | `START_L2` | - | - | 进入 L2 网格标定模式 |
| `0x11` | `RECORD_GRID` | 网格点号 (0-8) | - | 记录当前网格点 CoP 误差 |
| `0x12` | `COMMIT_L2` | - | - | 提交 L2 标定数据到 NVS |
| `0x20` | `ERASE` | - | - | 擦除所有标定数据 |
| `0x21` | `QUERY` | - | - | 查询当前标定状态 |
#### 示例
对通道 2 执行增益标定,已知质量 10.0 kg:
```text
AA 55 30 03 02 00 00 20 41 XX
```
- `AA 55 30`:标定命令帧头
- `03`subcmd = `GAIN_CH`
- `02`target = 通道 2
- `00 00 20 41`param = `10.0` kgfloat32 LE
- `XX`CRC-8/MAXIM
### 5.2 标定响应帧(上行)
标定响应帧固定 14 字节,平衡板在执行标定命令后回复:
| 字节偏移 | 字段 | 类型 | 值/范围 | 说明 |
|----------|------|------|---------|------|
| `0` | `sync0` | `uint8` | `0xAA` | 帧头第 1 字节 |
| `1` | `sync1` | `uint8` | `0x55` | 帧头第 2 字节 |
| `2` | `type` | `uint8` | `0x31` | 标定响应包类型 |
| `3` | `status` | `uint8` | 见下表 | 结果状态码 |
| `4` | `subcmd` | `uint8` | - | 对应的子命令回显 |
| `5-12` | `data` | `uint8[8]` | - | 响应数据(上下文相关) |
| `13` | `crc` | `uint8` | - | CRC-8/MAXIM 校验 |
#### 状态码定义
| 状态码 | 名称 | 说明 |
|--------|------|------|
| `0x00` | `OK` | 命令执行成功 |
| `0x01` | `ERR_STATE` | 状态机不允许此操作 |
| `0x02` | `ERR_NVS` | NVS 读写失败 |
| `0x03` | `ERR_PARAM` | 参数非法 |
#### data 字段含义
`data[8]` 内容取决于子命令:
| 子命令 | data 内容 | 说明 |
|--------|-----------|------|
| `TARE_CH` | `data[0..3]` = 零点 ADC 值 (int32 LE) | 通道去皮后的零点偏移 |
| `GAIN_CH` | `data[0..3]` = 增益 (float32 LE) | kg/count 换算系数 |
| `QUERY` | `data[0]` = L1 zero valid, `data[1]` = L1 gain valid, `data[2]` = L2 valid | 各级标定有效性标志 |
| 其他 | 全零 | 无附加数据 |
#### 示例
通道 2 增益标定成功,增益 = 5.322e-5 kg/count
```text
AA 55 31 00 03 XX XX XX XX 00 00 00 00 XX
```
- `AA 55 31`:标定响应帧头
- `00`status = `OK`
- `03`subcmd = `GAIN_CH`(回显)
- 前 4 字节 data:增益值 float32 LE
- 后 4 字节 data:填 0
- 末字节:CRC-8/MAXIM
## 6. 当前实现约束
- CoP 帧固定 11 字节,可在最小 ATT MTU 23(NUS 有效负载 20 字节)下传输。
- 50 Hz CoP 上行流隐式充当平衡板到基站的活性检测,因此心跳仅为下行。