231 lines
5.1 KiB
Markdown
231 lines
5.1 KiB
Markdown
# TCP2UART 项目技术实现
|
||
|
||
## 一、文档目的
|
||
|
||
本文档描述 `TCP2UART` 项目的最终内部实现口径。
|
||
|
||
本文档只围绕最终协议模型展开:
|
||
|
||
- `MUX`:串口承载层
|
||
- `NET`:全局网络配置层
|
||
- `LINK[idx]`:实例配置与连接管理层
|
||
|
||
不再保留历史 `S1... / C1...` 外部字段模型。
|
||
|
||
## 二、当前工程基础
|
||
|
||
当前工程基础约束如下:
|
||
|
||
1. MCU:`STM32F103R8T6`
|
||
2. 网络芯片:`CH390D`
|
||
3. 软件架构:`bare-metal main loop`
|
||
4. 协议栈:`lwIP RAW API + NO_SYS=1`
|
||
5. 调试输出:`SEGGER RTT`
|
||
6. 不使用 `FreeRTOS`
|
||
7. 不实现 DHCP
|
||
|
||
## 三、总体架构
|
||
|
||
```text
|
||
+--------------------------------------------------+
|
||
| AT / Control Plane |
|
||
| USART1 AT parser + MUX control frame parser |
|
||
+--------------------------------------------------+
|
||
| Configuration Model |
|
||
| MUX / NET / LINK[idx] |
|
||
+--------------------------------------------------+
|
||
| Routing & Session Layer |
|
||
| TCP instance scheduling + UART dispatch |
|
||
+--------------------------------------------------+
|
||
| Transport Poll Loop |
|
||
| ethernetif_poll / sys_check_timeouts / uart poll |
|
||
+--------------------------------------------------+
|
||
| Driver Layer |
|
||
| CH390 / lwIP netif / UART DMA+IDLE / HAL |
|
||
+--------------------------------------------------+
|
||
```
|
||
|
||
## 四、最终协议实现模型
|
||
|
||
### 4.1 MUX 帧承载层
|
||
|
||
数据口启用 MUX 后,统一处理如下帧:
|
||
|
||
```text
|
||
SYNC | LEN_H | LEN_L | SRCID | DSTMASK | PAYLOAD | TAIL
|
||
```
|
||
|
||
实现职责:
|
||
|
||
1. 识别帧边界
|
||
2. 解析长度字段
|
||
3. 提取 `SRCID`
|
||
4. 解析 `DSTMASK`
|
||
5. 按控制帧或数据帧分流
|
||
|
||
### 4.2 控制帧与数据帧分离
|
||
|
||
控制规则固定如下:
|
||
|
||
- `DSTMASK = 0x00`:系统控制帧
|
||
- `DSTMASK != 0x00`:业务数据帧
|
||
|
||
系统控制帧处理要求:
|
||
|
||
1. `PAYLOAD` 解释为 AT 文本
|
||
2. AT 文本必须以 `\r\n` 结束
|
||
3. 控制帧进入 AT 命令处理链路
|
||
|
||
业务数据帧处理要求:
|
||
|
||
1. `SRCID` 表示单一源端点
|
||
2. `DSTMASK` 表示目标端点集合
|
||
3. 路由层根据 `DSTMASK` 做多目标分发
|
||
|
||
### 4.3 统一端点编码
|
||
|
||
内部与外部文档统一使用以下端点编码:
|
||
|
||
| 端点 | 编码 |
|
||
|------|------|
|
||
| `C1` | `0x01` |
|
||
| `C2` | `0x02` |
|
||
| `UART2` | `0x04` |
|
||
| `UART3` | `0x08` |
|
||
| `S1` | `0x10` |
|
||
| `S2` | `0x20` |
|
||
|
||
实现要求:
|
||
|
||
- `SRCID` 为单值
|
||
- `DSTMASK` 为位图
|
||
- `DSTMASK=0x00` 仅保留为控制帧
|
||
|
||
## 五、配置层设计
|
||
|
||
### 5.1 MUX 记录
|
||
|
||
`MUX` 为全局记录,仅控制设备数据口是否进入 MUX 承载模式。
|
||
|
||
取值:
|
||
|
||
- `0`:普通透传
|
||
- `1`:MUX 透传
|
||
|
||
### 5.2 NET 记录
|
||
|
||
`NET` 为全局静态网络记录:
|
||
|
||
```text
|
||
IP,MASK,GW,MAC
|
||
```
|
||
|
||
说明:
|
||
|
||
- 设备只有一张网卡,因此不为每个实例单独配置本地 IP
|
||
- 当前实现目标中不包含 DHCP
|
||
|
||
### 5.3 LINK 记录
|
||
|
||
`LINK[idx]` 为统一实例记录:
|
||
|
||
```text
|
||
EN,LPORT,RIP,RPORT,UART
|
||
```
|
||
|
||
固定索引映射:
|
||
|
||
- `0 = S1`
|
||
- `1 = S2`
|
||
- `2 = C1`
|
||
- `3 = C2`
|
||
|
||
字段职责:
|
||
|
||
- `EN`:实例启用状态
|
||
- `LPORT`:本地端口
|
||
- `RIP / RPORT`:对端地址与端口
|
||
- `UART`:对应业务数据口
|
||
|
||
说明:
|
||
|
||
- `Server` 与 `Client` 共享同一记录结构
|
||
- `Server` 的 `RIP / RPORT` 可作为对端约束或预设
|
||
- `Client` 的 `RIP / RPORT` 表示远端目标
|
||
|
||
## 六、模块职责调整
|
||
|
||
### 6.1 配置模块 `config.c/.h`
|
||
|
||
最终职责:
|
||
|
||
1. 解析 `AT+MUX`
|
||
2. 解析 `AT+NET`
|
||
3. 解析 `AT+LINK`
|
||
4. 加载与保存配置
|
||
5. 处理 `SAVE / RESET / DEFAULT`
|
||
|
||
不再以历史展开式字段作为外部接口模型。
|
||
|
||
### 6.2 UART 透传模块 `uart_trans.c/.h`
|
||
|
||
最终职责:
|
||
|
||
1. 保持 `USART2 / USART3` 的 `DMA + IDLE` 接收发送基线
|
||
2. 在 `MUX=0` 时执行普通透传
|
||
3. 在 `MUX=1` 时执行 MUX 帧收发
|
||
4. 将控制帧与业务数据帧分流
|
||
|
||
### 6.3 TCP Server / Client 模块
|
||
|
||
最终职责:
|
||
|
||
1. 不再从外部协议角度区分不同字段模型
|
||
2. 统一受 `LINK[idx]` 配置驱动
|
||
3. 由调度层决定实例与 UART 的数据交换路径
|
||
|
||
## 七、主循环实现方向
|
||
|
||
主循环仍保持裸机轮询风格:
|
||
|
||
```c
|
||
while (1)
|
||
{
|
||
ethernetif_poll();
|
||
ethernetif_check_link();
|
||
sys_check_timeouts();
|
||
tcp_link_poll();
|
||
uart_mux_poll();
|
||
config_poll();
|
||
|
||
route_dispatch();
|
||
|
||
if (reset_requested) {
|
||
NVIC_SystemReset();
|
||
}
|
||
}
|
||
```
|
||
|
||
下一阶段实现要求:
|
||
|
||
1. 统一由 `LINK[idx]` 驱动实例状态
|
||
2. 统一由 `MUX` 决定数据口承载模式
|
||
3. 统一由 `route_dispatch()` 按 `SRCID / DSTMASK` 分发
|
||
|
||
## 八、实现边界
|
||
|
||
1. 保持单网卡静态网络模型
|
||
2. 不实现 DHCP
|
||
3. 不实现旧 `S1... / C1...` 外部协议字段
|
||
4. 不在文档中保留兼容层描述
|
||
5. 所有 AT 文本控制统一要求 `\r\n` 结束
|
||
|
||
## 九、文档一致性要求
|
||
|
||
后续实现、联调、测试与代码注释必须遵守以下统一口径:
|
||
|
||
1. 对外协议只使用 `MUX / NET / LINK`
|
||
2. 控制帧只使用 `DSTMASK=0x00`
|
||
3. MUX 帧格式固定为 `SYNC | LEN_H | LEN_L | SRCID | DSTMASK | PAYLOAD | TAIL`
|
||
4. AT 手册、需求说明、技术实现三份文档不得再出现历史展开式字段
|