硬件接口与电气特性: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 两根线实现。
流程是这样的:
- 接收方准备好接收数据时,拉高 RTS 信号。
- 发送方检测到 CTS 为高,开始发送数据。
- 接收方缓冲区快满了,拉低 RTS。
- 发送方检测到 CTS 为低,停止发送。
我曾经在一个项目中,接收端用的是低速单片机,发送端是高速 PC。如果不开启硬件流控,单片机根本来不及处理数据,缓冲区溢出导致大量丢包。开了 RTS/CTS 流控后,问题就解决了。
经验之谈:硬件流控不是万能的。如果发送端不支持 CTS 检测,或者接收端不支持 RTS 控制,那流控就形同虚设。调试时可以用示波器抓 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 没跑了。