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