设备通信与协议编程(一):RS-232、RS-485、UART 与 USB 虚拟串口

设备接上电脑、系统里出现一个 COM 口,并不意味着它“使用 RS-232 协议”。工程现场常把 UART、RS-232、RS-485 和 USB 虚拟串口混为一谈,结果是线缆、电平、拓扑和软件协议同时排错,越查越乱。

本文先建立分层模型。读完后,你应该能回答:设备两端的电气接口是什么、字节怎样传输、谁定义一帧消息,以及上位机究竟在操作哪一层。

1. 先把四个名字放回各自层次

名称主要解决的问题典型位置
UART字节如何串行化,波特率、数据位、校验位、停止位如何组织MCU 外设或串口控制器
RS-232单端电气信号、连接器与点对点连接仪器、调试口、旧式 PC 串口
RS-485差分电气信号与多节点总线能力工业现场总线、远距离设备链路
USB CDC ACM / 厂商驱动USB 设备如何向主机呈现串口式接口USB 转串口芯片、设备 USB 口

UART 不是线缆标准,RS-485 也不是完整应用协议。它们约定字符传输或电气信号层面的机制;命令字、长度、CRC、地址和应答规则仍由 Modbus RTU 或厂商协议定义——上层协议的具体形态见本系列《设备通信与协议编程(七):Modbus RTU/TCP》,隔离厂商差异的分层做法见《设备软件架构与控制模型(二):硬件抽象层与设备适配器》。

2. UART 帧不是应用协议帧

常见的 115200 8N1 表示:

  • 名义波特率为 115200;
  • 每个字符含 8 个数据位;
  • 无校验位(None);
  • 1 个停止位。

若再计入 1 个起始位,一个 8N1 字符通常在线路上占 10 bit。因此 115200 bit/s 的理论上限约为 11520 byte/s,尚未扣除应用协议头、校验、应答间隔和系统调度延迟。波特率不等于有效载荷吞吐率。

“UART 帧”描述一个字符的起止与校验;“应用协议帧”可能由几十个 UART 字符组成。上位机解析消息边界时,不能把一次驱动回调或一次 Read 当成一帧。

3. RS-232:点对点、单端、全双工

RS-232 通常以发送、接收和信号地构成点对点链路。它使用相对于信号地的单端电压,不能把 MCU 的 3.3 V TTL UART 引脚直接接到 RS-232 接口;中间需要匹配的电平转换器。

常见误区有三个:

  1. DB9 只是常见连接器,针脚定义仍要查设备手册;不能只看插头形状。
  2. “能收到乱码”往往说明路径已部分连通,应继续核对波特率、数据位、校验和地线。
  3. RTS/CTS、DTR/DSR 等握手线是否使用取决于双方设计;软件打开硬件流控前要确认实际接线。

4. RS-485:差分总线不是自动多机协议

RS-485 通过两根线之间的差分电压传输信号,抗共模干扰能力更适合工业环境。常见的两线制链路是半双工:同一时刻只有一个方向驱动总线;四线制可实现全双工,但设备和布线都必须支持。

多节点能力只说明多个收发器可以挂在总线上,不会自动解决以下问题:

  • 节点地址如何分配;
  • 谁可以发言,如何避免冲突;
  • 应答超时与重试规则;
  • 帧边界、端序和校验算法。

这些都属于更高层协议。工程上还要按收发器、线缆长度和速率设计终端匹配、偏置与接地,不能机械地在每个节点都并联终端电阻。

5. USB 虚拟串口:软件像串口,链路不是 UART

USB CDC ACM 或 USB 转串口驱动可以在操作系统中暴露 COMx/dev/ttyACM*/dev/ttyUSB*。应用仍能使用串口 API,但底层数据经 USB 事务和驱动缓冲传输。

因此:

  • “波特率”可能被设备真实采用,也可能只是驱动传给设备的配置提示;
  • 拔插会使设备节点消失并重新枚举,端口名不一定稳定;
  • USB 包边界、串口 Read 返回边界和应用消息边界互不等价;
  • VID/PID 只能识别产品类型,多个同型号设备还需序列号或物理端口路径区分。

6. 排错时沿层次向上走

推荐按下面顺序定位:

  1. 物理与电气层:接口类型、电平、A/B 极性、地线、终端和供电是否正确。
  2. 系统与驱动层:设备是否枚举、驱动是否加载、端口是否被其他进程占用。
  3. 字符层:波特率、数据位、校验位、停止位、流控是否一致。
  4. 协议层:地址、命令、长度、端序、转义、校验和超时是否匹配。
  5. 业务层:设备当前状态是否允许该命令,参数是否越界。

先用逻辑分析仪、示波器或串口分析工具确认线上确实有字节,再讨论 JSON、CRC 或业务状态,能显著缩短排错路径。

7. 选型边界

场景更自然的选择
板内 MCU 与外设UART、SPI 或 I²C,取决于距离、速率和布线
单台仪器、短距离维护口RS-232 或 USB 虚拟串口
多节点、较长距离、强干扰环境RS-485 加明确的上层协议
高带宽图像、持续大数据USB、GigE Vision 等,不应强行套串口
多轴硬实时同步CANopen、EtherCAT 等工业网络,而非普通串口轮询

选择接口时不要只比较标称速率,还要评估确定性、隔离、连接器可靠性、驱动维护、诊断能力和设备生命周期。

8. 小结

UART 定义字符传输,RS-232/RS-485 主要定义电气接口,USB 虚拟串口提供操作系统抽象,真正的消息语义属于应用协议。把这几层分开,是后续编写串口接收循环、二进制帧解析器和故障恢复逻辑的前提。

参考资料

Licensed under CC BY-NC-SA 4.0