硬件接口与电气特性:RS-232、RS-485、TTL 电平标准对比

做 UART 驱动,光会配寄存器可不够。你得懂硬件接口长什么样,电平怎么定义的。我见过不少工程师,软件调得飞起,结果一接上设备就是乱码,最后发现是电平不匹配。说白了,UART 只是协议层,物理层靠的是这些接口标准。

三种主流电平标准

咱们先看最常用的三种:TTL、RS-232、RS-485。它们干的活都是串行通信,但电气特性天差地别。

特性 TTL (3.3V/5V) RS-232 RS-485
逻辑"1" 2.0V ~ VCC -3V ~ -15V A-B > +200mV
逻辑"0" 0V ~ 0.8V +3V ~ +15V A-B < -200mV
传输距离 <1米 约15米 可达1200米
通信方式 单端 单端 差分
典型应用 板级通信 工控/串口调试 工业总线/远距离

核心要点:TTL 是芯片内部用的,RS-232 是早期 PC 串口标准,RS-485 是工业现场总线的主力。千万别把 TTL 信号直接怼到 RS-232 接口上——我吃过这个亏,烧了一块开发板的 CP2102 芯片。

RS-232:老当益壮的串口标准

RS-232 是历史最悠久的串行接口标准。它用 ±12V 左右的电压传输,抗干扰能力比 TTL 强不少。但有个问题——它只能点对点通信,而且距离一长信号就衰减。

我记得刚入行时调试一台老式 PLC,用的就是 RS-232 转 DB9 线。当时死活连不上,折腾了半天才发现是 RTS/CTS 流控没配好。嗯,这个后面细说。

RS-485:工业现场的王牌

RS-485 用的是差分信号传输。什么意思?就是靠两根线(A 和 B)的电压差来判断逻辑。这种设计天然抗共模干扰,还能挂多个设备(最多 32 个节点)。

我在一个工厂项目中用过 RS-485 总线,距离大概 800 米,挂了一堆传感器。一开始没加终端电阻,数据包老是丢。后来在总线两端各加了一个 120Ω 电阻,问题就解决了。

实战技巧:RS-485 总线两端必须加终端电阻(120Ω),否则信号反射会导致数据错误。中间节点不需要加。

常见接口引脚定义

不管哪种标准,核心信号就那几个:TX、RX、RTS、CTS。但不同接口的引脚编号不一样,你得记清楚。

信号 全称 方向 说明
TX Transmit Data 输出 发送数据
RX Receive Data 输入 接收数据
RTS Request to Send 输出 请求发送
CTS Clear to Send 输入 允许发送
GND Ground - 信号地

注意:TTL 电平的 TX 和 RX 是交叉连接的——你的 TX 接对方的 RX,你的 RX 接对方的 TX。RS-232 的 DB9 接口也是交叉,但 RS-485 的 A/B 线是直连的。

硬件流控原理

硬件流控,说白了就是让接收方告诉发送方:"我忙不过来了,你先停一下。" 它靠 RTS 和 CTS 两根线实现。

流程是这样的:

  1. 接收方准备好接收数据时,拉高 RTS 信号。
  2. 发送方检测到 CTS 为高,开始发送数据。
  3. 接收方缓冲区快满了,拉低 RTS。
  4. 发送方检测到 CTS 为低,停止发送。

我曾经在一个项目中,接收端用的是低速单片机,发送端是高速 PC。如果不开启硬件流控,单片机根本来不及处理数据,缓冲区溢出导致大量丢包。开了 RTS/CTS 流控后,问题就解决了。

经验之谈:硬件流控不是万能的。如果发送端不支持 CTS 检测,或者接收端不支持 RTS 控制,那流控就形同虚设。调试时可以用示波器抓 RTS/CTS 波形,看看电平变化是否正常。

知识体系结构图

下面这张图帮你理清本章的核心逻辑:

UART硬件接口与电气特性知识体系 UART 物理层 TTL 电平 RS-232 RS-485 3.3V/5V 单端信号 板级通信(<1米) ±12V 单端信号 点对点(约15米) 差分信号(A/B线) 多节点(可达1200米) 核心:引脚定义(TX/RX/RTS/CTS)+ 硬件流控

避坑指南

  • 电平转换不能省:MCU 的 TTL 信号不能直接接 RS-232 或 RS-485 总线,必须用电平转换芯片(如 MAX232、SP3485)。
  • 共地是必须的:RS-232 和 TTL 都是单端信号,收发双方必须共地。不共地的话,信号参考点不一样,数据肯定错。
  • 终端电阻别乱加:RS-485 只在总线两端加 120Ω 电阻。中间节点加了反而会降低信号质量。
  • 流控不是摆设:如果通信双方速度差距大,或者数据量不稳定,建议开启硬件流控。软件流控(XON/XOFF)在二进制数据传输时容易出问题。

调试小技巧:手头没有示波器?可以用逻辑分析仪抓 TX/RX 波形。看电平幅值就能判断是 TTL 还是 RS-232。如果看到 ±12V 的跳变,那就是 RS-232 没跑了。