UART基础回顾:从协议到硬件,这些你都得心里有数
各位同学,咱们这门课叫《UART通信中断与DMA传输协同优化项目性能调优实战》,第一章先把地基打牢。UART这东西,说简单也简单,说复杂——嗯,等你真在项目里被它坑过就知道了。我这些年调过的板子,少说有一半的通信问题都出在UART上,不是波特率对不上,就是帧格式配错了。
所以这一章,咱们把UART的协议原理、帧格式、波特率计算、常见硬件接口捋一遍。别嫌基础,后面讲中断和DMA协同优化的时候,这些概念会反复出现。
1.1 UART协议原理:说白了就是两根线的事
UART,全称Universal Asynchronous Receiver/Transmitter,通用异步收发器。异步是什么意思?就是收发双方没有共同的时钟线,各自靠约定的波特率来采样。
我刚开始做嵌入式那会儿,总觉得异步通信不靠谱,没有时钟同步怎么行?后来想明白了——你想想看,两个人约好每秒钟说一个字,只要双方都按这个节奏来,哪怕没有节拍器,也能沟通。UART就是这么干的。
UART通信只需要两根数据线:
- TXD:发送数据线
- RXD:接收数据线
注意,两个设备连接时要交叉:A设备的TXD接B设备的RXD,A设备的RXD接B设备的TXD。这个我见过太多新手接反了,结果调一整天都通不了。
1.2 帧格式:一帧数据长什么样?
UART的数据是一帧一帧传的。每一帧包含以下几个部分:
| 字段 | 长度 | 说明 |
|---|---|---|
| 起始位 | 1 bit | 逻辑低电平,标志传输开始 |
| 数据位 | 5~9 bit | 常用8 bit,即一个字节 |
| 校验位 | 0/1 bit | 可选,奇校验或偶校验 |
| 停止位 | 1/1.5/2 bit | 逻辑高电平,标志传输结束 |
举个例子,最常用的配置是8N1:8位数据、无校验、1位停止位。加上起始位,一帧总共10个bit。
我曾经在一个项目里遇到过这样的问题:设备A发出来的数据,设备B总是收到乱码。查了半天,发现A用的是8E1(偶校验),B配的是8N1。校验位被B当成数据位吃了,后面全乱了。从那以后,我每次联调第一件事就是核对双方的帧格式。
1.3 波特率计算:别让时钟误差吃掉你的数据
波特率,就是每秒传输的符号数。对于UART来说,一个符号就是一个bit,所以波特率等于比特率。
常用波特率有:9600、19200、38400、115200、921600等。115200是嵌入式开发中最常用的,速度适中,稳定性也好。
波特率怎么算出来的?看公式:
波特率 = 时钟频率 / (16 × 分频系数)
大多数MCU的UART模块内部有一个16倍过采样机制,也就是说每个bit会被采样16次。分频系数就是你要往波特率寄存器里写的值。
举个例子,假设系统时钟是16 MHz,想要115200的波特率:
分频系数 = 16,000,000 / (16 × 115,200) ≈ 8.68
取整后为9,实际波特率 = 16,000,000 / (16 × 9) ≈ 111,111
误差 = (115,200 - 111,111) / 115,200 ≈ 3.55%
3.55%的误差,在UART通信中已经偏大了。标准要求误差在2%以内才可靠。所以这个配置其实不太行。
那怎么办?要么换时钟频率,要么换波特率。比如用14.7456 MHz的晶振,就能精确得到115200:
分频系数 = 14,745,600 / (16 × 115,200) = 8
实际波特率 = 14,745,600 / (16 × 8) = 115,200
误差 = 0%
这也是为什么很多通信芯片喜欢用14.7456 MHz、18.432 MHz这类晶振——它们能整除常用波特率。
1.4 常见硬件接口:RS-232、RS-485、TTL
UART是协议层,但物理层可以有多种实现。我整理了一个对比表:
| 接口标准 | 电平 | 传输方式 | 最大距离 | 典型应用 |
|---|---|---|---|---|
| TTL | 0V / 3.3V或5V | 单端 | 几十厘米 | 板级通信 |
| RS-232 | ±3V ~ ±15V | 单端 | 15米左右 | 调试串口、老式设备 |
| RS-485 | 差分 ±1.5V ~ ±6V | 差分 | 1200米 | 工业总线、多机通信 |
TTL电平是MCU直接输出的,电压低,抗干扰差,只能板内或短距离用。RS-232把电平抬高了,能传远一点,但速度上不去。RS-485用差分信号,共模抑制能力强,适合工业现场。
我记得有一次去现场排查故障,客户说设备通信距离只有50米就丢包了。我一看,他们用TTL电平直接拉了50米的线——这不出问题才怪。后来加了RS-485转换器,问题就解决了。
1.5 本章知识体系总览
下面这张图把UART的核心知识点串起来了,你可以把它当成本章的思维导图:
好了,UART的基础知识就复习到这里。协议原理、帧格式、波特率计算、硬件接口——这四个方面你心里得有数。后面讲中断和DMA的时候,我会反复提到这些概念,尤其是波特率误差和帧格式配置,这两个是调优的起点。