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

做 UART 通信,光会写代码可不够。我见过太多工程师,软件调得飞起,一接上硬件就抓瞎——要么通信距离不够,要么烧芯片。说白了,你得先搞懂这些接口到底在物理层干了什么。

今天咱们就把 RS-232、RS-485 和 TTL 这三个老伙计拉出来遛遛。它们本质上都是在传 UART 的数据帧,但电气特性天差地别。选错了,项目就得返工。

TTL 电平:板级通信的默认选项

TTL 电平是单片机最常用的。逻辑 1 对应 3.3V 或 5V,逻辑 0 对应 0V。简单粗暴,但抗干扰能力弱,传输距离一般不超过 1 米。

我记得刚入行时做过一个项目,板子上的两块 MCU 用 TTL 直连,跑 115200bps 稳得很。后来客户要求把其中一块 MCU 放到 3 米外,结果数据全是乱码。嗯,这就是 TTL 的局限性——它只适合板内或短距离通信。

实用建议: 调试阶段用 TTL 电平最方便,逻辑分析仪直接夹上去就能看。但产品定型后,如果涉及长距离或强干扰环境,必须换 RS-485 或 RS-422。

RS-232:老当益壮的工业标准

RS-232 用正负电压表示逻辑电平:-3V ~ -15V 为逻辑 1,+3V ~ +15V 为逻辑 0。这种差分思想(虽然它不算真正的差分)让它的抗干扰能力比 TTL 强不少,传输距离能到 15 米左右。

但 RS-232 有个硬伤——它只能点对点通信。你想想看,一个串口只能连一个设备,这在现代工业现场多憋屈。不过很多老设备(比如 PLC、工业仪表)还在用这个接口,所以你还得会伺候它。

RS-485:工业现场的王牌

RS-485 才是真正的差分信号。它用两根线(A、B)的电压差来传数据:A-B > +200mV 为逻辑 1,A-B < -200mV 为逻辑 0。这种设计让它能抗共模干扰,传输距离轻松到 1200 米。

更厉害的是,RS-485 支持多节点通信。一条总线上最多能挂 256 个设备(实际受驱动芯片限制)。我在一个工厂项目中用过 32 个温湿度传感器挂一条 RS-485 总线,跑 9600bps,一年没出过问题。

核心对比: 三种接口的电气特性差异决定了它们的应用场景。TTL 适合板级,RS-232 适合短距离点对点,RS-485 适合长距离多节点。

三种接口的电气参数对比

参数 TTL (3.3V) RS-232 RS-485
逻辑 1 电平 2.0V ~ 3.6V -3V ~ -15V A-B > +200mV
逻辑 0 电平 0V ~ 0.8V +3V ~ +15V A-B < -200mV
传输方式 单端 单端 差分
最大距离 1 米 15 米 1200 米
节点数 点对点 点对点 最多 256
抗干扰能力 弱 中 强

常见接口芯片:MAX232 与 SP3485

光有协议标准还不够,你得用芯片把电平转过来。这里介绍两个我常用的芯片。

MAX232:TTL 转 RS-232 的老将

MAX232 内部有电荷泵,能把 5V 电源升到 ±10V 左右,满足 RS-232 的电平要求。它内置两路收发器,一路发一路收,正好对应 UART 的 TX 和 RX。

我踩过一个坑:MAX232 的 VCC 必须接 5V,不能接 3.3V。有一次我手头只有 3.3V 电源,想着凑合用,结果输出电平只有 ±5V,接上 RS-232 设备后通信时断时续。后来查手册才发现,3.3V 版本叫 MAX3232,别搞混了。

避坑指南: 我曾经在批量生产时发现一批板子 RS-232 通信不稳定,排查半天发现是 MAX232 的 C1+、C1- 引脚接的电容用了 0.1μF,而手册要求 1μF。电容值不对,电荷泵效率下降,输出电平不够。从此以后,我每次画原理图都会再三确认电容规格。

SP3485:RS-485 的可靠选择

SP3485 是 3.3V 供电的 RS-485 收发器,最高速率能到 10Mbps。它内部有失效保护功能——当总线开路或短路时,输出为逻辑 1,避免误触发。

SP3485 的引脚很简单:RO 接 MCU 的 RX,DI 接 TX,RE 和 DE 分别是接收使能和发送使能。我习惯把 RE 和 DE 连在一起,用一个 GPIO 控制方向。发送时拉高,接收时拉低,省一个引脚。

// SP3485 方向控制示例
#define RS485_DE_RE   PB1   // 方向控制引脚

void rs485_send_byte(uint8_t data) {
    // 切换到发送模式
    GPIO_SetBits(GPIOB, RS485_DE_RE);
    // 等待方向切换稳定(约 1μs)
    delay_us(1);
    // 发送数据
    USART_SendData(USART1, data);
    // 等待发送完成
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    // 切回接收模式
    GPIO_ResetBits(GPIOB, RS485_DE_RE);
}

接口选型决策流程

选接口其实没那么复杂。我一般按这个思路来:

  1. 先看距离: 1 米以内用 TTL,15 米以内用 RS-232,超过 15 米用 RS-485。
  2. 再看节点数: 超过两个设备必须用 RS-485。
  3. 最后看干扰: 电机、变频器附近优先 RS-485。

下面这张图把整个决策过程画出来了,你照着走就行。

UART 接口选型决策流程 确定通信需求 传输距离 ≤ 1 米? 是 否 TTL 距离 ≤ 15 米? 节点数 = 2? 是 否 RS-232 RS-485 说明: • TTL:板级通信,距离短,成本低 • RS-232:点对点,抗干扰中等,适合工控设备对接 • RS-485:多节点,长距离,抗干扰强,工业现场首选

实际项目中的接口转换

很多时候,你手头的 MCU 是 TTL 电平,但外设是 RS-232 或 RS-485。这时候就需要电平转换电路。我一般这么搭:

  • TTL → RS-232: MAX232 或 MAX3232,注意供电电压和电容值。
  • TTL → RS-485: SP3485 或 MAX3485,注意方向控制和终端电阻(120Ω)。
  • RS-232 → RS-485: 需要两级转换,先用 MAX232 转成 TTL,再用 SP3485 转成 RS-485。
经验之谈: 我习惯在 RS-485 总线的两端各加一个 120Ω 终端电阻。不加的话,信号反射会导致数据错位。有一次我偷懒没加,结果 100 米外的设备收不到数据,加了电阻立马解决。