Files
TCP2UART/项目技术实现.md

5.1 KiB
Raw Permalink Blame History

TCP2UART 项目技术实现

一、文档目的

本文档描述 TCP2UART 项目的最终内部实现口径。

本文档只围绕最终协议模型展开:

  • MUX:串口承载层
  • NET:全局网络配置层
  • LINK[idx]:实例配置与连接管理层

不再保留历史 S1... / C1... 外部字段模型。

二、当前工程基础

当前工程基础约束如下:

  1. MCUSTM32F103R8T6
  2. 网络芯片:CH390D
  3. 软件架构:bare-metal main loop
  4. 协议栈:lwIP RAW API + NO_SYS=1
  5. 调试输出:SEGGER RTT
  6. 不使用 FreeRTOS
  7. 不实现 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

实现职责:

  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:普通透传
  • 1MUX 透传

5.2 NET 记录

NET 为全局静态网络记录:

IP,MASK,GW,MAC

说明:

  • 设备只有一张网卡,因此不为每个实例单独配置本地 IP
  • 当前实现目标中不包含 DHCP

LINK[idx] 为统一实例记录:

EN,LPORT,RIP,RPORT,UART

固定索引映射:

  • 0 = S1
  • 1 = S2
  • 2 = C1
  • 3 = C2

字段职责:

  • EN:实例启用状态
  • LPORT:本地端口
  • RIP / RPORT:对端地址与端口
  • UART:对应业务数据口

说明:

  • ServerClient 共享同一记录结构
  • ServerRIP / RPORT 可作为对端约束或预设
  • ClientRIP / 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 / USART3DMA + IDLE 接收发送基线
  2. MUX=0 时执行普通透传
  3. MUX=1 时执行 MUX 帧收发
  4. 将控制帧与业务数据帧分流

6.3 TCP Server / Client 模块

最终职责:

  1. 不再从外部协议角度区分不同字段模型
  2. 统一受 LINK[idx] 配置驱动
  3. 由调度层决定实例与 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();
    }
}

下一阶段实现要求:

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