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:
@@ -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` kg(float32 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 上行流隐式充当平衡板到基站的活性检测,因此心跳仅为下行。
|
||||
|
||||
Reference in New Issue
Block a user