第2章:UART物理层:RS-232、RS-485、TTL电平标准详解

大家好,我是你们的嵌入式系统讲师。今天我们来聊聊UART物理层的那些事儿。很多初学者写驱动时,逻辑完全正确,但就是通信失败——十有八九是电平标准搞错了。我当年刚入行时也踩过这个坑,所以这一章咱们把它彻底讲透。

2.1 为什么需要不同的电平标准?

UART协议本身只定义了数据帧的格式(起始位、数据位、校验位、停止位),但它没规定信号线上到底用多少伏代表“1”和“0”。这就好比大家约定好了说话的内容,但没规定用多大的声音说。

不同的应用场景对电压、距离、抗干扰能力的要求完全不同。于是就有了三种主流的物理层实现:

  • TTL电平:板级通信,距离短(<1米),电压低(0~5V或0~3.3V)
  • RS-232:早期PC与外设通信,距离中等(约15米),电压高(±12V左右)
  • RS-485:工业现场总线,距离远(可达1200米),差分信号抗干扰强

核心要点:同一个UART控制器,配上不同的电平转换芯片,就能变成TTL、RS-232或RS-485接口。驱动开发者需要关心的,是逻辑电平的对应关系,而不是物理电压值。

2.2 TTL电平标准

TTL(Transistor-Transistor Logic)是我们在开发板上最常见到的。说白了,就是直接用芯片的供电电压来代表逻辑电平。

参数 5V TTL 3.3V TTL(LVTTL)
逻辑1(输出) ≥2.4V ≥2.0V
逻辑0(输出) ≤0.4V ≤0.4V
逻辑1(输入) ≥2.0V ≥1.7V
逻辑0(输入) ≤0.8V ≤0.7V

实战经验:我个人习惯在3.3V系统中使用5V容忍(5V-tolerant)的引脚。有一次项目里误接了5V的TTL模块到3.3V的STM32上,幸好引脚支持5V容忍,否则芯片就烧了。你设计电路时一定要看数据手册的“Vin”最大值。

TTL电平的UART信号线通常只有三根:TX(发送)、RX(接收)、GND(地)。空闲时TX和RX保持高电平(逻辑1),起始位拉低(逻辑0)。

2.3 RS-232标准

RS-232是历史最悠久的串口标准。我记得早期电脑的DB9串口就是RS-232接口。它用正负电压来表示逻辑电平,而不是TTL的0~5V。

参数 RS-232电平
逻辑1(Mark) -3V ~ -15V
逻辑0(Space) +3V ~ +15V
电压摆幅 约±12V
最大传输距离 约15米(9600bps时)

这里有个容易混淆的点:RS-232的逻辑1是负电压,逻辑0是正电压。这和TTL正好相反。所以MCU的UART引脚不能直接连RS-232接口,中间必须加电平转换芯片,比如经典的MAX232。

避坑指南:我曾经见过有人直接把3.3V的TX引脚接到RS-232的DB9接口上,结果不但通信失败,还把电脑的串口烧了。记住:TTL和RS-232之间必须用转换芯片,不能直连!

2.4 RS-485标准

RS-485是工业现场最常用的串口标准。它采用差分信号传输,抗干扰能力极强。为什么?你想想看,两根线(A和B)上传输的是互补信号,外部噪声同时叠加到两根线上,相减之后噪声就被抵消了。

参数 RS-485
传输方式 差分(半双工或全双工)
逻辑1 A-B > +200mV
逻辑0 A-B < -200mV
最大节点数 32个(标准),可扩展至256个
最大传输距离 1200米(100kbps时)
共模电压范围 -7V ~ +12V

RS-485最常用的模式是半双工,即同一时刻只能发送或接收。驱动里需要控制DE(发送使能)和RE(接收使能)引脚。我习惯把DE和RE短接,用一个GPIO控制:高电平发数据,低电平收数据。

关键区别:TTL和RS-232都是单端信号(一根信号线+地),而RS-485是差分信号(两根线互为参考)。差分信号的优势在于长距离和抗共模干扰,代价是需要多一根线。

2.5 三种标准的对比总结

下面这张表是我做项目时经常参考的,建议你收藏起来:

特性 TTL RS-232 RS-485
信号类型 单端 单端 差分
逻辑1电压 2.0V~5V -3V~-15V A-B > +200mV
逻辑0电压 0V~0.8V +3V~+15V A-B < -200mV
最大距离 <1米 ~15米 ~1200米
最大速率 10Mbps+ 115.2kbps(典型) 10Mbps(短距离)
多节点 点对点 点对点 多点(总线型)
典型芯片 直连MCU MAX232, SP3232 MAX485, SN75176

2.6 电平转换电路设计要点

在实际项目中,我们经常需要在这三种标准之间转换。这里给出几个我常用的电路设计思路:

  1. TTL转RS-232:使用MAX232或SP3232芯片,内部有电荷泵产生±12V电压
  2. TTL转RS-485:使用MAX485或SN75176,注意控制DE/RE引脚
  3. 3.3V与5V TTL互转:用MOS管或专用电平转换芯片(如TXS0108)

我的习惯:做RS-485项目时,我总会在A、B线之间并联一个120Ω的终端电阻。为什么?因为信号在长线上会反射,终端电阻能吸收反射波。如果总线长度超过300米,这个电阻必须加,否则数据会出错。

2.7 知识结构图

下面这张SVG图帮你理清三种电平标准的核心差异和应用场景:

UART物理层电平标准对比图 UART物理层电平标准对比 TTL电平 RS-232 RS-485 特性 单端信号 0~5V / 0~3.3V 距离 < 1米 板级通信 特性 单端信号 ±12V 摆幅 距离 ~15米 PC外设 特性 差分信号 A-B 电压差 距离 ~1200米 工业总线 驱动开发核心 逻辑电平对应关系 + 转换芯片选型 + 使能引脚控制 注意:TTL和RS-232逻辑电平极性相反,RS-485需控制收发使能

2.8 驱动开发中的电平适配

写驱动时,你不需要关心具体的电压值,但必须知道以下几点:

  • GPIO配置:TTL电平的TX/RX引脚通常配置为推挽输出和浮空输入
  • 极性反转:如果外接RS-232转换芯片,有些芯片会反转逻辑极性,驱动里可能需要配置UART的极性寄存器
  • 使能控制:RS-485驱动里,发送数据前要先拉高DE引脚,发送完成后及时拉低

曾经踩过的坑:有一次我用RS-485做多机通信,发送完数据后忘记关闭DE使能,结果总线一直被自己占用,其他设备发不了数据。后来我在驱动里加了一个发送完成中断,在中断服务函数里立即拉低DE,问题才解决。

好了,这一章的内容就到这里。电平标准是UART通信的基础,搞懂了这些,后面写驱动时才能游刃有余。