2、硬件接口与电气特性:RS-232、RS-485、TTL电平标准对比
做嵌入式开发,尤其是搞UART通信,第一关往往不是代码怎么写,而是硬件怎么接。我见过不少新手,拿着3.3V的TTL串口模块直接怼到RS-232的DB9接口上,结果要么没反应,要么冒烟。说白了,电平标准不匹配,神仙也救不了。
这一章,咱们就把RS-232、RS-485和TTL这三种最常见的电平标准掰开揉碎讲清楚。你搞懂了它们的电压范围、逻辑定义和物理接口,以后画板子、接线、排查故障,心里就有底了。
2.1 三种电平标准的核心差异
先看一张对比表,把最关键的参数列出来。我个人习惯,做项目前先拿这个表对照一下,避免选型翻车。
| 特性 | TTL (3.3V/5V) | RS-232 | RS-485 |
|---|---|---|---|
| 逻辑1 (高电平) | 2.0V ~ VCC (通常3.3V或5V) | -3V ~ -15V | A-B > +200mV |
| 逻辑0 (低电平) | 0V ~ 0.8V | +3V ~ +15V | A-B < -200mV |
| 电压摆幅 | 0 ~ 3.3V 或 0 ~ 5V | ±12V 典型 | 差分 ±1.5V ~ ±6V |
| 传输方式 | 单端 (共地) | 单端 (共地) | 差分 (双绞线) |
| 最大距离 | 几米 (通常 < 1.5m) | 约 15m @ 9600bps | 1200m @ 100kbps |
| 最大节点数 | 点对点 (1对1) | 点对点 (1对1) | 最多256个 (半双工) |
| 典型应用 | 板级通信、MCU与传感器 | 工控设备、老式PC外设 | 工业总线、远距离多机通信 |
嗯,这里要注意一点:RS-232的逻辑电平是反的。TTL里高电平是1,低电平是0;但RS-232里,-3V到-15V才是1,+3V到+15V反而是0。我第一次用示波器看RS-232波形时,差点以为自己接反了线。
2.2 TTL电平:板级通信的默认语言
TTL(Transistor-Transistor Logic)是咱们嵌入式开发中最常用的电平标准。MCU的UART引脚,默认就是TTL电平。3.3V的STM32,5V的AVR,输出高电平就是VCC,低电平就是GND附近。
关键点:
- TTL是单端信号,发送和接收共用一个地线。地线没接好,数据全是乱码。
- 驱动能力弱,线长了信号会衰减。我试过用TTL串口拉5米线,9600波特率勉强能跑,但偶尔丢字节。
- 3.3V和5V的TTL不能直接互连,需要电平转换。我曾经偷懒直接连,结果烧了一个3.3V的传感器。
2.3 RS-232:老当益壮的工业标准
RS-232是串口通信的老祖宗。它用±12V的电压摆幅,抗干扰能力比TTL强不少。虽然现在PC上已经很少见了,但在工业设备、PLC、老式仪器仪表里,RS-232接口依然大量存在。
为什么电压要搞到±12V? 说白了,就是为了抗噪声。工业现场电磁干扰大,TTL那点电压幅度,线长一点就被噪声淹没了。RS-232把电压抬高到12V,信噪比上去了,传输距离就能到15米左右。
2.4 RS-485:远距离多机通信的王者
RS-485是差分信号传输,用两根线(A和B)的电压差来表示逻辑0和1。差分信号天然抗共模干扰,所以传输距离能到1200米,而且支持多节点挂载。
RS-485的核心优势:
- 差分传输: 两根线绞在一起,外部噪声在两根线上产生的干扰几乎相同,差分接收器只认差值,噪声被抵消。
- 多节点: 标准RS-485最多支持32个节点,用高阻抗芯片可以扩展到256个。
- 半双工/全双工: 两线制是半双工(收发不能同时),四线制是全双工。工业上常用两线制,节省线缆。
我记得有一次做楼宇自动化项目,控制节点分布在整栋楼里,距离远、节点多。用RS-485总线,一根双绞线串起所有设备,稳定跑了三年没出过问题。
2.5 DB9接口定义与常见连接方式
DB9是RS-232最常用的物理接口。虽然标准定义了9个引脚,但实际通信只需要3根线:TXD、RXD、GND。
DB9公头/母头引脚定义(RS-232):
| 引脚号 | 信号名称 | 方向 | 说明 |
|---|---|---|---|
| 1 | DCD | 输入 | 载波检测 |
| 2 | RXD | 输入 | 接收数据 |
| 3 | TXD | 输出 | 发送数据 |
| 4 | DTR | 输出 | 数据终端就绪 |
| 5 | GND | - | 信号地 |
| 6 | DSR | 输入 | 数据设备就绪 |
| 7 | RTS | 输出 | 请求发送 |
| 8 | CTS | 输入 | 清除发送 |
| 9 | RI | 输入 | 振铃指示 |
最常见的三种接线方式:
- 三线制(最常用): 只接TXD(3)、RXD(2)、GND(5)。适合大多数调试和简单通信场景。
- 五线制: 在三线基础上加RTS(7)和CTS(8),用于硬件流控。高速传输时防止数据溢出。
- 全串口: 所有9根线全接。用于Modem等需要握手信号的设备。
2.6 电平转换与硬件连接实战
实际项目中,MCU的TTL电平要转成RS-232或RS-485才能接外部设备。转换芯片是必须的。
TTL转RS-232: 用MAX232或SP3232。芯片内部有电荷泵,能把3.3V/5V升压到±12V。接线很简单:MCU的TXD接芯片的T1IN,芯片的T1OUT接DB9的TXD;RXD方向相反。
TTL转RS-485: 用MAX485或SP3485。芯片有DE(发送使能)和RE(接收使能)引脚。半双工模式下,DE和RE可以短接,用一个GPIO控制收发方向。
下面是一个典型的TTL转RS-485接线示意图:
MCU (TTL) MAX485 RS-485总线
-------- ------- ----------
TXD ------> DI (驱动器输入)
RXD <------ RO (接收器输出)
GPIO ------> DE & RE (使能控制)
A ---------------> A线 (差分正)
B ---------------> B线 (差分负)
GND ------> GND GND (屏蔽地)
2.7 知识结构图:电平标准与接口选型
下面这张图总结了三种电平标准的适用场景和转换关系。你画板子前看一眼,选型就不会错。
2.8 避坑总结
做UART硬件设计,我踩过的坑不少。总结几条血泪教训:
- GND必须接: 不管用哪种电平标准,地线不接,通信就是玄学。我曾经调试一个设备,数据时好时坏,折腾了两天,最后发现是地线虚焊。
- 电平转换不能省: TTL直接怼RS-232,轻则通信失败,重则烧芯片。MAX232才几块钱,别省这个钱。
- RS-485终端电阻: 距离超过100米或者波特率高于9600,终端电阻必须加。不加的话,信号反射会导致数据错位。
- DB9引脚别搞错: 公头和母头的引脚号是镜像的。焊接时一定要对照引脚定义图,我见过有人把TXD和RXD焊反了,结果数据发出去收不回来。