UART物理层:从芯片引脚到RS-232的“翻译官”
做嵌入式开发,尤其是跟串口打交道,你迟早会遇到一个让人头疼的问题:单片机明明输出的是0和1,为什么连上电脑的DB9串口就是不通?
说白了,这就是物理层标准不统一造成的。单片机引脚上跑的是TTL电平,而PC的串口遵循的是RS-232标准。这两个标准,电压范围完全不同。我刚开始做项目时,就因为这个吃了不少苦头。
TTL电平标准:单片机世界的“方言”
TTL,全称Transistor-Transistor Logic,是数字电路里最基础的电平标准。在5V供电的单片机系统里,它的定义很简单:
- 逻辑1:电压范围 2.0V ~ 5.0V(通常就是VCC)
- 逻辑0:电压范围 0V ~ 0.8V(通常就是GND)
嗯,这里要注意,TTL电平的噪声容限其实不大。0.8V到2.0V之间是“不确定区”,信号如果落在这个区间,接收端可能读出0,也可能读出1。我在调试一块老旧的51开发板时,就遇到过因为电源纹波太大,导致串口数据偶尔错位的情况。后来加了滤波电容才解决。
RS-232电平标准:PC串口的“普通话”
RS-232标准诞生得比TTL早,它是为了长距离传输而设计的。为了抗干扰,它把电压摆幅拉得很大:
- 逻辑1(Mark):电压范围 -3V ~ -15V
- 逻辑0(Space):电压范围 +3V ~ +15V
为什么会这样?你想想看,在长线缆上,+5V和0V的差值太小,很容易被噪声淹没。RS-232用±12V甚至更高的电压,相当于把信号“吼”出去,抗干扰能力自然强。但代价就是,它不能直接跟单片机连——你给单片机引脚送个-12V,芯片瞬间就冒烟了。
DB9接口定义:9根针,各司其职
DB9是RS-232最常用的物理接口。虽然叫9针,但实际串口通信只需要3根线:TX(发送)、RX(接收)、GND(地线)。
我画个表格,把最常用的引脚列出来:
| 引脚编号 | 名称 | 方向 | 功能说明 |
|---|---|---|---|
| 2 | RXD | 输入 | 接收数据(设备接收) |
| 3 | TXD | 输出 | 发送数据(设备发送) |
| 5 | GND | - | 信号地线 |
| 7 | RTS | 输出 | 请求发送(硬件流控) |
| 8 | CTS | 输入 | 清除发送(硬件流控) |
实际项目中,大部分场景只用2、3、5三根线。流控引脚(RTS/CTS)在低速通信时基本用不上。我记得有一次调试一个GPS模块,对方要求硬件流控,结果我忘了接CTS线,数据一直发不出去。查了半天才发现是流控没配置对。
电平转换芯片:MAX232的“翻译”艺术
既然TTL和RS-232不能直接对话,就需要一个“翻译官”。MAX232就是最经典的芯片之一。它的核心功能就两个:
- 升压:把单片机的+5V转换成RS-232需要的±10V左右
- 电平转换:把TTL的0~5V信号,映射到RS-232的±12V范围
MAX232内部有电荷泵,通过外接4个电解电容(通常是1μF)来产生正负电压。我画个简单的连接图,你看一眼就明白了:
连接的时候,记住一个口诀:TTL的TX接MAX232的T1IN,MAX232的T1OUT接DB9的RX。反过来,DB9的TX接MAX232的R1IN,MAX232的R1OUT接单片机的RX。千万别接反了,我见过有人把TX和RX直连,结果两边都在发数据,谁也收不到。
避坑指南:我踩过的那些坑
- 电容极性不能错:MAX232外接的电解电容有正负极,接反了电荷泵不工作,输出端电压上不去。我曾经因为电容装反,折腾了一下午才发现问题。
- 地线必须共地:TTL设备和RS-232设备之间,GND一定要连在一起。不共地的话,电平参考点不同,数据全是乱码。这是新手最容易忽略的。
- 长线缆要加终端电阻:如果RS-232线缆超过15米,建议在接收端加一个120Ω的匹配电阻,防止信号反射。不过大多数短距离应用不需要。
好了,物理层的东西就这些。说白了,TTL是芯片内部的语言,RS-232是设备之间的语言,MAX232就是那个同声传译。理解了这三者的关系,串口通信的硬件部分你就掌握了八成。