1. UART基础与RS232电平标准
做嵌入式这些年,我调试过不少串口设备。说实话,UART 是嵌入式工程师打交道最多的接口之一。它简单、可靠,但坑也不少。这一章我们先打好基础,把 UART 通信原理、RS232 电平标准以及电平转换芯片选型这些核心问题讲透。
1.1 UART通信原理
UART,全称是 Universal Asynchronous Receiver/Transmitter。它是个异步串行通信接口。什么叫异步?就是收发双方没有独立的时钟线,靠约定的波特率来同步。
我刚开始学的时候,总觉得异步通信不靠谱。没有时钟线,两边怎么对齐?后来才明白,UART 靠的是起始位来「对表」。每次传输开始,发送方先拉低电平,接收方检测到这个跳变,就知道数据要来了。
UART 一帧数据的标准结构:
- 空闲位:总线保持高电平
- 起始位:1 位,低电平,标志传输开始
- 数据位:5~9 位,常用 8 位,低位在前
- 校验位:可选,奇校验或偶校验
- 停止位:1 位或 2 位,高电平,标志传输结束
你想想看,这个结构其实很巧妙。没有时钟线,但靠电平跳变就能对齐。不过代价就是每帧都有额外开销——起始位和停止位占了 2 位,有效数据利用率只有 80% 左右。
1.2 起始位 / 数据位 / 校验位 / 停止位详解
咱们一个一个拆开看。
起始位
起始位就是一根「发令枪」。发送端把 TX 线从高电平拉到低电平,保持一个位时间。接收端检测到这个下降沿,就开始采样后面的数据位。我在项目中遇到过一个问题:如果线缆太长,信号反射会导致下降沿不陡峭,接收端可能漏检起始位。解决办法是加施密特触发器整形,或者降低波特率。
数据位
数据位是真正传信息的部分。常用 8 位,因为一个字节正好 8 位。传输顺序是 LSB(最低有效位)在前,MSB(最高有效位)在后。举个例子,你要发 0x55(二进制 01010101),实际线上先发 1,再发 0,交替进行。
校验位
校验位用来做简单的错误检测。奇校验要求数据位 + 校验位里 1 的个数为奇数;偶校验要求为偶数。说实话,这个校验只能检测奇数个位翻转,实用性有限。我一般不用校验位,直接用 CRC 做更可靠的校验。
停止位
停止位是高电平,持续 1 位或 2 位时间。它给接收端一个缓冲,让处理器有时间处理刚收到的字节。波特率越高,停止位越重要。115200 波特率下,我习惯用 2 位停止位,能明显降低接收端溢出丢数据的概率。
经验之谈:配置 UART 时,8 数据位 + 无校验 + 1 停止位(8N1)是最通用的组合。除非有特殊要求,否则就用这个。
1.3 RS232 电平标准(±12V)
UART 本身只定义了逻辑协议,没规定电平大小。TTL 电平的 UART 是 0~3.3V 或 0~5V。但 RS232 标准不一样,它用 ±12V 来传输。
| 参数 | TTL 电平 | RS232 电平 |
|---|---|---|
| 逻辑 1(高电平) | 2.0V ~ 5.0V | -3V ~ -15V(通常 -12V) |
| 逻辑 0(低电平) | 0V ~ 0.8V | +3V ~ +15V(通常 +12V) |
| 噪声容限 | 约 0.4V | 约 2V |
| 最大传输距离 | 约 1 米 | 约 15 米 |
为什么 RS232 要用 ±12V?说白了就是为了抗干扰。±12V 的摆幅比 TTL 大得多,噪声容限也高。在工业现场,电机启停、继电器动作都会产生强电磁干扰,TTL 电平很容易被误触发,RS232 就好很多。
不过 RS232 也有缺点。它需要额外的电源来产生 ±12V,功耗大,而且只能点对点通信,不能组网。这些限制在后面讲 RS485 时会对比得更清楚。
注意:绝对不要把 TTL 电平的 UART 直接接到 RS232 设备上!±12V 会烧坏你的 MCU 引脚。我见过有人图省事直接连,结果芯片冒烟了。必须用电平转换芯片。
1.4 TTL 与 RS232 电平转换芯片选型与电路设计
电平转换的核心芯片是 MAX232 系列。它内部有电荷泵,能把 5V 电源升压到 ±12V 左右。
MAX232 典型电路
// MAX232 典型外围电路连接
// 电源部分
VCC (5V) -> MAX232 引脚 16
GND -> MAX232 引脚 15
// 电荷泵电容(4 个 1μF 电解电容)
C1+ (引脚 1) -> 1μF -> C1- (引脚 3)
C2+ (引脚 4) -> 1μF -> C2- (引脚 5)
V+ (引脚 2) -> 1μF -> GND
V- (引脚 6) -> 1μF -> GND
// 数据通道
MCU_TX -> T1IN (引脚 11) -> T1OUT (引脚 14) -> DB9 引脚 2
DB9 引脚 3 -> R1IN (引脚 13) -> R1OUT (引脚 12) -> MCU_RX
这个电路我画过几十次了。有几个坑要注意:
- 电荷泵电容必须用电解电容或钽电容,不能用瓷片电容。瓷片电容在低温下容值会掉,导致输出电压不够。
- 电容耐压要选 16V 以上,别用 10V 的,电荷泵输出可能超过 10V。
- MAX232 的 V+ 和 V- 引脚对地要加电容滤波,否则纹波会很大。
选型对比
| 芯片型号 | 供电电压 | 通道数 | 速率 | 特点 |
|---|---|---|---|---|
| MAX232 | 5V | 2 发 2 收 | 120kbps | 经典款,外围需要 4 个电容 |
| MAX3232 | 3.3V / 5V | 2 发 2 收 | 250kbps | 兼容 3.3V,低功耗 |
| SP3232 | 3.3V / 5V | 2 发 2 收 | 250kbps | 性价比高,国产替代多 |
| MAX3243 | 3.3V / 5V | 3 发 5 收 | 1Mbps | 多通道,带自动关断 |
我个人习惯用 MAX3232。它支持 3.3V 供电,速率也够用。如果项目成本敏感,SP3232 也是不错的选择,我测试过几批,性能差别不大。
1.5 本章知识结构图
下面这张图把 UART 帧结构、电平转换流程和芯片选型串起来了。你可以把它当一张速查表用。
设计建议:画 PCB 时,MAX232 的电荷泵电容要尽量靠近芯片引脚,走线短而粗。V+ 和 V- 的滤波电容也放近些。我见过有人把电容放得老远,结果输出电压纹波大得没法用。
好了,这一章的内容就是这些。UART 基础、RS232 电平标准、MAX232 选型与电路设计,都是后面做 RS485 组网和缓冲区优化的前提。把这些吃透了,后面遇到问题才能快速定位。