USB 转串口:USB 半双工 ↔ UART 全双工 工作原理

先厘清两个基础概念

  1. UART 串口(TTL):真正全双工
    • TXD:发送;RXD:接收;两根独立信号线。
    • 可以同一时刻一边发数据,一边收数据,收发互不干扰。
  2. USB2.0 全速(CH340/CP2102 这类芯片用的):物理层半双工
    • 只有 D+、D‑差分信号线,同一时刻只能单向传输数据,不能同时上行 + 下行。

重点:不需要软件做切换,不需要用户写代码处理收发切换;全部由 USB 转 UART 芯片硬件 + 内部协议栈自动完成,不是我们应用层去操作切换。

很多人误区:以为要写代码做收发切换;实际芯片内部自动做协议转换。

1、数据流向拆解

方向 1:PC → USB 芯片 → UART TX 输出(PC 发,单片机收)

PC 下发串口数据 → USB 总线(半双工,主机向下发包)→ CH340 芯片内部 USB 协议引擎接收 → 芯片把数据搬运到 UART 发送 FIFO → UART 的 TXD 引脚逐 bit 发送给单片机 RX。

方向 2:单片机 → UART RXD → USB 芯片 → PC(单片机发,PC 收)

单片机数据给到 CH340 的 RXD 引脚,存入芯片内部 UART 接收 FIFOUSB 是主机轮询机制:PC 定期轮询 USB 设备,芯片收到轮询令牌,把 FIFO 里的数据打包上传给 PC。

矛盾点: UART 可以同时收、同时发;但 USB 物理总线不能同时上传和下传。 芯片内部靠FIFO 缓冲区 + USB 轮询调度,化解两边的传输能力差异。

plaintext

PC端USB主机
    ↕(USB半双工,分时复用,不能同时双向)
【USB转串口芯片】
│  ├─USB协议控制器
│  ├─发送FIFO(PC→UART)
│  ├─接收FIFO(UART→PC)
│  └─UART控制器(真正全双工TXD/RXD)
    ↕(UART全双工,收发并行)
STM32单片机USART

2、FIFO 缓冲区的核心作用(关键)

CH340、CP2102 内部都有硬件 FIFO(发送 FIFO、接收 FIFO)

  • PC 下发数据过来:USB 收到数据先放进【发送 FIFO】,UART 硬件慢慢从 FIFO 取出,从 TXD 输出给单片机。即使 USB 总线暂时要做接收上传,FIFO 缓存住待发送字节,UART 继续往外发,UART 侧不受 USB 半双工限制。
  • 单片机往 RXD 发数据:UART 收到字节存入【接收 FIFO】,暂时存起来;等到 USB 主机轮询时机到来,芯片把 FIFO 缓存的数据打包上传 PC。

现象:UART 可以同一时刻 TX 往外发、RX 往里面收;USB 侧是分时轮流上传 / 下传;FIFO 把两边隔离,应用层完全感受不到半双工限制

3、为什么不需要我们做 “切换”?

USB 协议本身是主机轮询架构:PC(主机)掌控总线。

  1. PC 下发数据(OUT 包):总线用于 PC→芯片;
  2. 之后 PC 发起 IN 轮询包:芯片有数据就上传单片机发来的数据; USB 主机自动分时调度 OUT、IN 包,硬件协议栈自动完成方向切换,完全由芯片内部硬件完成,应用程序、单片机不需要干预,不需要写切换逻辑

注意:这个切换是 USB 协议硬件固有的,不是寄存器写某个 bit 去切换收发模式。

4、极限压力场景:UART 同时高速收发,会发生什么?

UART 全双工跑满,一边大量发、一边大量收。 因为 USB 是分时,会出现短暂的吞吐瓶颈,靠 FIFO 缓冲:

  1. 如果 FIFO 满了:芯片会启用 USB 的流控机制,通知 PC 暂停下发数据;
  2. 如果开启 UART 硬件流控 RTS/CTS:芯片还可以通过 RTS 引脚通知单片机暂停发送,防止 UART 接收 FIFO 溢出丢字节。

👉工程建议:高速双向大数据,打开硬件流控 RTS/CTS,防止 FIFO 溢出丢包。

5、常见误区澄清

误区 1:USB 半双工,所以串口也不能同时收发

❌错误。UART 侧依旧真正全双工;芯片内部 FIFO 做隔离。PC 上串口软件可以同时收发,你可以一边下发指令,一边接收单片机上报数据。

误区 2:需要操作寄存器做收发方向切换

❌错误。USB 协议层由芯片硬件完成,单片机侧只需要正常操作 USART 外设收发,不需要关心 USB。

误区 3:半双工会导致串口一定丢数据

不一定,只要 FIFO 足够大,波特率不超过 USB 全速的上限;高速双向传输建议开启硬件流控。

6、对比硬件流控的作用

CH340 支持 RTS、CTS 硬件流控:

  • CTS:输入,单片机通知 CH340:我收满了,请不要再发;
  • RTS:输出,CH340 通知单片机:我接收 FIFO 快满,请你停止发送。

当 USB 侧上传速度跟不上 UART 接收速度,芯片内部接收 FIFO 即将溢出,RTS 置高,通知单片机暂停发送,避免丢字节。

7、总结一句话

USB 转串口芯片内部具备独立的 USB 控制器、UART 控制器、双方向硬件 FIFO。USB 物理层半双工的分时方向切换由 USB 硬件协议自动完成,应用层、单片机完全不需要做任何切换操作;UART 侧保持全双工工作;FIFO 缓冲抹平两边传输特性差异;高速双向通信建议开启 RTS/CTS 硬件流控,防止缓冲区溢出丢数据。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐