diff --git a/doc/HSJL 上位机串口通信协议.md b/doc/HSJL 上位机串口通信协议.md index 07315b0..2c71b19 100644 --- a/doc/HSJL 上位机串口通信协议.md +++ b/doc/HSJL 上位机串口通信协议.md @@ -1,19 +1,25 @@ # HSJL 上位机串口通信协议 -> 版本:v1.0 -> 日期:2025 年 6 月 5 日 +> 版本:v1.1 +> 日期:2025 年 6 月 10 日 --- ## 总览 +HSL 上位机服务于 HSJL 演示验证,用于演示 3 节点组网通信功能(1 个主节点,2 个从节点)。 + - 物理接口:UART(串口通信) - 通信方式:PC 主动下发控制帧,节点响应或上传数据 - 支持功能: - - 指令控制 - - 图像数据传输 - - 节点遥测与状态上报 - + - 状态查询:查询板卡的硬件状态 + - 指令控制:业务速率切换、节点角色切换、时隙表切换等 + - 图像数据传输: + - 业务部分 Payload 为图像数据,数据流向为 PC 下发 → 空口发送 → 空口接收 → 节点上传。 + - 对于较大的图片,需要 PC 进行数据包切割与重组。 + - 业务流向为主-从双向,主节点需要向不同从节点发送数据,不同从节点也会给主节点发送数据。 + - (可选)节点遥测:读取节点工作状态日志,并进行存储。 + - UART 串口配置 | 参数 | 配置值 | @@ -28,14 +34,20 @@ 每帧数据通过串口独立传输,格式如下: +``` mermaid +block-beta + columns 6 + a["帧头"] b["数据段"] c["Dummy Byte"] d["校验和"] e["数据段长度"] f["帧尾"] ``` -[帧头][数据段][Dummy Byte][校验和][数据长度][帧尾] + +``` +[帧头][数据段][Dummy Byte][校验和][数据段长度][帧尾] ``` | 字段名 | 字节数 (Byte) | 说明 | |--|--|--| | 帧头 | 2 | 固定值:`0x5A 0x54` | -| 数据段 | ≤1000 | 业务数据内容 | +| 数据段 | ≤950 | 业务数据内容 | | Dummy Byte | 1 | 固定填充:`0x00` | | 校验和 | 1 | 所有**数据段**字节累加和(无符号累加) | | 数据段长度 | 2 | 数据段字节数(不含 Dummy/校验/帧尾) | @@ -57,6 +69,14 @@ 数据段格式如下,下发(PC→节点)和上传(节点→PC)均使用一致的格式: +``` mermaid +block-beta + columns 8 + HEAD["帧头"]:1 DATA["数据段"]:3 DUMMY["Dummy Byte"]:1 CHECKSUM["校验和"]:1 LENGTH["数据段长度"]:1 TAIL["帧尾"]:1 + + NULL11[" "]:1 CMD["指令"]:1 TYPE["节点类型"]:1 PAYLOAD["Payload"]:1 NULL12[" "]:1 NULL13[" "]:1 NULL14[" "]:1 NULL15[" "]:1 +``` + ``` [指令][节点类型][Payload] ``` @@ -65,18 +85,18 @@ | -------- | ------------- | ---------------- | | 指令 | 1 | 控制指令 | | 节点类型 | 1 | 固定填充:`0xEE` | -| Payload | ≤1000 | 由指令类型决定 | +| Payload | ≤950 | 由指令类型决定 | 指令类型如下: | 指令 | 含义 | 下发 Payload 长度 (Byte) | 上传 Payload 长度 (Byte) | | ------ | --------------------- | ------------------------ | ------------------------ | | `0xE1` | 自检 | 0, payload 无数据 | 21 | -| `0xE2` | Echo 测试 | ≤1000 | 与下发长度一致 | +| `0xE2` | Echo 测试 | ≤950 | 与下发长度一致 | | `0xE3` | 节点配置 | 4 | None,无上传 | | `0x33` | 系统信息 (目前可忽略) | 54 | None,无上传 | -| `0xE4` | 发送数据下发 | ≤1000 | None,无上传 | -| `0xE5` | 接收数据上传 | None,无下发,自动上传 | ≤1000 | +| `0xE4` | 发送数据下发 | ≤950 | None,无上传 | +| `0xE5` | 接收数据上传 | None,无下发,自动上传 | ≤950 | | `0xE6` | 遥测 | 0, payload 无数据 | 188 | ### 自检指令 @@ -104,28 +124,73 @@ ### Echo 测试 -Echo 测试中节点将 PC 下发的数据直接回传,不做其他处理。 +Echo 测试中节点将 PC 下发的数据直接回传,不做其他处理。Echo 测试数据的 Payload 格式如下,顺序存储,长度可变。 + +| 字段名 | 字节数 (Byte) | 说明 | +| -------- | ------------- | ---------------------- | +| 数据长度 | 2 | 数据字节数 | +| 数据 | ≤950 | 长度由数据长度字段决定 | ### 节点配置指令 -节点配置指令下发的 Payload 格式如下,顺序存储,共 19 字节: +节点配置指令下发的 Payload 格式如下,顺序存储,共 4 字节: -| 字段名 | 字节数 (Byte) | 说明 | -| ---------- | ------------- | ----------------------------------------------------------- | -| 节点使能 | 1 | `0xAA`: 启用
`0x55`: 停用 | -| 节点角色 | 1 | `0x11`: 簇首
`0x00`: 成员 | -| 业务速率 | 1 | `0x22`: 128 kbps
`0x33`: 256 kbps
`0x44`: 2 Mbps | -| 时隙表编号 | 1 | 编号值,0~2 | +| 字段名 | 字节数 (Byte) | 说明 | +| -------------------- | ------------- | ---------------------------------------------------------- | +| 节点使能 | 1 | `0xAA`: 启用
`0x55`: 停用 | +| 节点 ID | 1 | `0x00`: 簇首
`0x01`~`0x09`: 成员 | +| 业务速率 | 1 | `0x22`: 128 kbps
`0x33`: 256 kbps
`0x44`: 2 Mbps | +| 时隙表编号(可扩展) | 1 | 编号值,0~2(可扩展) | + +> [!warning] +> +> 时隙表单次运行周期为 500 ms,不同时隙表中主从节点数据交互次数、可用从节点 ID 范围不同,**从节点只与主节点进行通信**,目前暂定时隙表如下: +> +> - 0 号时隙表,主节点分别给 2 个从节点发送 1 次;每个从节点给主节点发送 1 次。 +> - 1 号时隙表,主节点分别给 2 个从节点发送 5 次;每个从节点给主节点发送 5 次。 +> - 2 号时隙表,待定。 ### 发送数据下发 -需注意整个 UART 帧的长度(包括帧头、数据段、Dummy、校验和、数据段长度、帧尾)不超过 1024 Byte。 +发送数据的 Payload 格式如下,顺序存储,长度可变。 + +```mermaid +block-beta + columns 11 + HEAD["帧头"]:1 DATA_CHUNK["数据段"]:6 DUMMY["Dummy Byte"]:1 CHECKSUM["校验和"]:1 LENGTH["数据段长度"]:1 TAIL["帧尾"]:1 + + NULL11[" "]:1 CMD["指令"]:1 TYPE["节点类型"]:1 PAYLOAD["Payload"]:4 NULL12[" "]:1 NULL13[" "]:1 NULL14[" "]:1 NULL15[" "]:1 + + NULL21[" "]:1 NULL22[" "]:1 NULL23[" "]:1 DATAID["数据 ID"]:1 DSTID["目的节点 ID"]:1 D_LEN["数据长度"]:1 DATA["数据"]:1 NULL24[" "]:1 NULL25[" "]:1 NULL26[" "]:1 NULL27[" "]:1 +``` + +| 字段名 | 字节数 (Byte) | 说明 | +| ----------- | ------------- | ----------------------- | +| 数据 ID | 4 | 数据编号 | +| 目的节点 ID | 1 | 消息目的节点 ID | +| 数据长度 | 2 | 数据长度(不含数据 ID) | +| 数据 | ≤950 | 长度由数据长度字段决定 | + +> [!Warning] +> +> 1. 需注意整个 [UART 帧](#UART 帧结构定义)的长度(包括帧头、数据段、Dummy、校验和、数据段长度、帧尾)不超过 1024 Byte。 +> 2. 数据最大长度同时由业务速率档位决定: +> - 128 kbps 档位:数据长度最大为 42 Byte。 +> - 512 kbps 档位:数据长度最大为 267 Byte。 +> - 2 Mbps 档位:数据长度最大为 1222 Byte,但是受限于 PL buffer 的长度,[UART 帧](#UART 帧结构定义)的长度不超过 1024 Byte。 ### 接收数据上传 -接收到的数据将自动打包上传,无需下发指令。 +接收到的数据将自动打包上传,无需下发指令。接收数据的 Payload 格式与发送的格式一致,顺序存储,长度可变。 -### 遥测指令 +| 字段名 | 字节数 (Byte) | 说明 | +| --------- | ------------- | ----------------------- | +| 数据 ID | 4 | 数据编号 | +| 源节点 ID | 1 | 消息来源节点 ID | +| 数据长度 | 2 | 数据长度(不含数据 ID) | +| 数据 | ≤950 | 长度由数据长度字段决定 | + +### (可选)遥测指令 遥测指令上传的 Payload 由 5 部分组成,顺序存储,共 188 字节: