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 帧结构、电平转换流程和芯片选型串起来了。你可以把它当一张速查表用。

UART RS232 电平转换知识结构 UART 帧结构 起始位(1位,低电平) 数据位(5~9位,LSB优先) 校验位(可选,奇/偶) 停止位(1~2位,高电平) 电平转换芯片 MAX232 / MAX3232 / SP3232 电荷泵升压:5V → ±12V 外围电容:4×1μF 电解 RS232 电平标准 逻辑 1:-3V ~ -15V 逻辑 0:+3V ~ +15V 噪声容限:约 2V 最大距离:约 15 米 TTL 电平 RS232 电平 核心流程:MCU TTL UART → MAX232 电平转换 → RS232 标准电平 → DB9 连接器 注意:MAX232 需要 5V 供电,MAX3232 支持 3.3V,选型时根据 MCU 电压决定

设计建议:画 PCB 时,MAX232 的电荷泵电容要尽量靠近芯片引脚,走线短而粗。V+ 和 V- 的滤波电容也放近些。我见过有人把电容放得老远,结果输出电压纹波大得没法用。

好了,这一章的内容就是这些。UART 基础、RS232 电平标准、MAX232 选型与电路设计,都是后面做 RS485 组网和缓冲区优化的前提。把这些吃透了,后面遇到问题才能快速定位。