# 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 手册、需求说明、技术实现三份文档不得再出现历史展开式字段