1. UART 基础概念:从原理到实战
大家好,我是你们的嵌入式硬件讲师。今天咱们开始第一讲——UART 的基础概念。说实话,UART 是我入行接触的第一个通信协议,也是我调试过最多次的接口。别看它简单,坑可不少。咱们一步步来。
什么是 UART?
UART,全称 Universal Asynchronous Receiver/Transmitter,通用异步收发器。说白了,就是一种串行通信的硬件模块。它负责把数据一位一位地发出去,再一位一位地收回来。
我习惯这么理解:UART 就像两个人用一根电话线聊天。一个人说,另一个人听。说的人把字拆成一个个字母,按顺序念;听的人按顺序记下来,再拼成完整的句子。这就是串行通信的本质。
核心特点:
- 异步:没有时钟线,靠双方约定好的速率(波特率)同步
- 全双工:发送和接收可以同时进行,互不干扰
- 点对点:通常只连接两个设备,不像 I2C 可以挂多个从机
UART 模块内部一般包含:发送移位寄存器、接收移位寄存器、波特率发生器、控制逻辑。数据从 CPU 写入发送缓冲,然后移位寄存器按位送出;接收端反过来,把收到的位拼成字节,存入接收缓冲。
UART 的历史:从电传打字机到物联网
UART 的历史其实挺有意思。最早可以追溯到 20 世纪 60 年代的电传打字机。那时候计算机和终端之间需要通信,但并行线缆太贵,于是串行通信应运而生。
1960 年代,贝尔实验室开发了早期的 UART 芯片。到了 1970 年代,Intel 推出了 8250 UART 芯片,这玩意儿成了 PC 串口的标配。我记得刚入行时还用过 16550 UART,它带了一个 16 字节的 FIFO 缓冲,比前辈 8250 强太多了。
现在呢?UART 几乎被集成到所有 MCU 里了。STM32、ESP32、AVR……随便一个单片机都带好几个 UART 外设。物联网设备里,UART 仍然是 WiFi 模块、蓝牙模块、GPS 模块之间通信的主力。
| 年代 | 代表芯片 | 特点 |
|---|---|---|
| 1960s | 早期分立元件 | 体积大、功耗高、速率低 |
| 1970s | Intel 8250 | 集成化、PC 标准、无 FIFO |
| 1980s | 16550 | 16 字节 FIFO、速率提升 |
| 1990s 至今 | MCU 内置 UART | 多通道、可配置、低功耗 |
UART 与 RS232 的关系
这个问题我经常被问到。UART 和 RS232 到底是不是一回事?
不是。 但很多人混着叫。
UART 是芯片内部的逻辑模块,它输出的是 TTL 电平信号:0V 代表逻辑 0,3.3V 或 5V 代表逻辑 1。而 RS232 是一种电气标准,它定义了不同的电平:-3V ~ -15V 代表逻辑 1,+3V ~ +15V 代表逻辑 0。
你想想看,如果两个设备都用 TTL 电平,距离一远信号就衰减了。RS232 用更高的电压摆幅,抗干扰能力强,能传 15 米左右。但代价是需要电平转换芯片,比如经典的 MAX232。
实战经验: 我早期做项目时,直接用 TTL 电平连了两个板子,距离不到 1 米,结果数据乱码。后来加了 MAX232 转成 RS232 电平,问题立刻解决。电平匹配是 UART 通信的第一道坎。
所以,UART 是协议层,RS232 是物理层。UART 定义了数据怎么打包(起始位、数据位、校验位、停止位),RS232 定义了信号怎么在线上传输(电压高低)。
UART 与 RS485 的区别
RS485 是另一种物理层标准,和 RS232 完全不同。我做个表格对比一下:
| 特性 | UART (TTL) | RS232 | RS485 |
|---|---|---|---|
| 电平 | 0V / 3.3V 或 5V | ±3V ~ ±15V | 差分 ±2V ~ ±6V |
| 传输方式 | 单端 | 单端 | 差分 |
| 最大距离 | 几米 | 约 15 米 | 1200 米 |
| 节点数 | 2 个 | 2 个 | 最多 256 个 |
| 速率 | 最高数 Mbps | 最高 115200 bps 常见 | 最高 10 Mbps |
| 应用场景 | 板级通信 | 短距离设备互联 | 工业总线、长距离 |
RS485 最大的优势是差分信号和总线拓扑。差分信号抗共模干扰强,适合工业环境。总线拓扑允许挂多个设备,用地址区分。我曾经在一个工厂项目中,用 RS485 挂了 32 个传感器,一根双绞线跑了 800 米,稳得很。
注意: RS485 是半双工的,同一时刻只能一个设备发送。需要软件或硬件控制收发切换。我见过不少新手忘记切换方向,导致总线冲突,数据全乱。
UART 数据帧结构
UART 的数据帧是固定的格式。咱们来看一个典型的 8N1 帧(8 数据位、无校验、1 停止位):
起始位(1) + 数据位(8) + 停止位(1)
空闲: 高电平
起始位: 低电平 (1 bit)
数据位: LSB 先发 (8 bits)
停止位: 高电平 (1 bit)
举个例子,发送 0x55(二进制 01010101),LSB 先发,所以线上顺序是:
起始位(0) + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 0 + 停止位(1)
注意:0x55 的 LSB 是 1,所以第一个数据位是 1
为什么 LSB 先发?这是历史原因,早期电传打字机就这么定的。后来大家都遵循这个习惯。
知识结构图
下面这张图总结了 UART 的核心知识体系,方便你整体把握:
小结
这一章咱们把 UART 的底子打好了。记住几个关键点:
- UART 是异步串行通信协议,没有时钟线
- RS232 是电气标准,用 ±12V 传输,需要电平转换
- RS485 是差分总线,适合长距离多节点
- 数据帧格式:起始位 + 数据位 + 校验位(可选) + 停止位