Files

4.8 KiB
Raw Permalink Blame History

TCP2UART 项目说明

TCP2UART 是一个基于 STM32F103RCT6 + CH390D 的 TCP 与双串口透传固件。系统运行在 FreeRTOS 上,网络协议栈使用 lwIP NO_SYS=0 + netconn API,通过 SEGGER RTT 输出调试日志,工程入口为 Keil MDK 项目 MDK-ARM/TCP2UART.uvprojx

本仓库当前文档已经收敛为两类:

  1. 面向开发者的代码阅读与系统理解文档。
  2. 面向上位机、测试和联调人员的 AT 命令接口文档。

硬件与软件基线

项目 内容
主控 STM32F103RCT6
以太网芯片 CH390D
配置串口 USART1
数据串口 USART2USART3
RTOS FreeRTOS
TCP/IP lwIPNO_SYS=0,启用 netconn API
调试输出 SEGGER RTT
构建工程 MDK-ARM/TCP2UART.uvprojx

USART1 只承担 AT 配置面。USART2/USART3 是业务数据口,可工作在普通透传模式或 MUX 帧模式。网络侧提供 2 路 TCP Server 实例和 2 路 TCP Client 实例,统一使用 LINK 配置模型管理。

当前文档地图

文档 读者 内容
README.md 所有人 项目总览、文档入口、快速理解路径
项目代码阅读指南.md 固件开发、调试、交接人员 代码目录、启动流程、任务模型、数据流、阅读顺序、调试线索
AT固件使用手册.md 上位机、测试、联调人员 AT 命令、参数模型、默认值、配置流程、常见错误

旧的需求说明、技术实现、调试交接、Prompt 和单点问题复盘文档已经合并到上述文档中。临时调试结论不再作为根目录入口,避免把某一轮现场状态误认为长期项目事实。

一句话架构

远端 TCP 连接
    |
    v
TcpSrvTask_S1/S2 或 TcpCliTask_C1/C2
    |
    v
route_msg_t + FreeRTOS Queue
    |
    v
UartRxTask / uart_trans
    |
    v
USART2 / USART3

反向数据流也走同一套路由对象:数据口收到字节后由 UartRxTask 判断普通透传或 MUX 帧,再投递到对应 xLinkTxQueues[],最终由 TCP 任务调用 netconn_write() 发回网络。

快速阅读顺序

首次接手建议按下面顺序阅读:

  1. README.md:确认硬件、软件、文档入口。
  2. 项目代码阅读指南.md 的“总体架构”和“业务数据流示例”:先建立整体图。
  3. Core/Src/main.c:理解上电初始化顺序。
  4. Core/Src/freertos.c:理解队列、信号量和任务创建。
  5. App/config.cAT固件使用手册.md:理解配置模型和 AT 命令。
  6. App/tcp_server.cApp/tcp_client.cApp/uart_trans.cApp/route_msg.c:理解 TCP 与 UART 如何互相转发。
  7. App/task_net_poll.cDrivers/CH390/*Drivers/LwIP/src/netif/ethernetif.c:需要定位网络底层问题时再深入。

核心配置模型

固件内部把所有链路抽象为 4 条 LINK

角色 内部索引 端点编码 含义
S1 CONFIG_LINK_S1 0x10 TCP Server 1
S2 CONFIG_LINK_S2 0x20 TCP Server 2
C1 CONFIG_LINK_C1 0x01 TCP Client 1
C2 CONFIG_LINK_C2 0x02 TCP Client 2
UART2 / U0 LINK_UART_U0 0x04 数据串口 0
UART3 / U1 LINK_UART_U1 0x08 数据串口 1

每条 LINK 记录包含:启用状态、本地端口、远端 IP、远端端口、绑定的数据串口。外部配置命令见 AT固件使用手册.md

常用开发入口

目的 文件
上电初始化 Core/Src/main.c
任务和队列创建 Core/Src/freertos.c
AT 命令与 Flash 参数 App/config.cApp/flash_param.c
路由消息池 App/route_msg.c
UART DMA/IDLE、普通透传、MUX 帧 App/uart_trans.c
TCP Server App/tcp_server.c
TCP Client App/tcp_client.c
网络初始化和轮询 App/task_net_poll.c
CH390 与 lwIP netif Drivers/CH390/*Drivers/LwIP/src/netif/ethernetif.c
RTT 日志封装 Core/Src/debug_log.c

调试提示

  1. 启动阶段先看 RTT 中的 debug_log_boot() 里程碑,例如 hal-initclock-configperipherals-readytasks-createdscheduler-start
  2. 网络阶段重点看 NetPollTasktcpip-initnetif-initnetif-readypost-ready free/min heap 日志。
  3. TCP 或 UART 透传异常时,优先检查 route_send() 返回的 poolqueueinvalid,它们能区分消息池耗尽、队列满和参数错误。
  4. HardFault、MemManage、BusFault、UsageFault 会进入 Debug_TrapWithRttHint(),应先保留 RTT 现场再修改代码。
  5. STM32F103RCT6 RAM 余量有限;如果 full-task 模式下问题呈现强资源相关特征,应优先核对堆、栈、水位和 lwIP 池配置,不要只看业务逻辑。

更详细的阅读和调试路线见 项目代码阅读指南.md