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。这个我见过太多新手接反了,结果调一整天都通不了。

我的习惯:画原理图的时候,我会在TXD和RXD旁边加个小箭头标注方向,这样Layout和焊接的时候不容易搞混。

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当成数据位吃了,后面全乱了。从那以后,我每次联调第一件事就是核对双方的帧格式。

避坑指南:我曾经在批量产线上下发过错误的配置——固件里写死了8N1,但产测脚本用的是8E1。结果3000台设备有200台通信失败。后来我在代码里加了帧格式自检逻辑,上电先发一个握手帧确认配置,对不上就报错。

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%以内才可靠。所以这个配置其实不太行。

关键点:波特率误差超过2%,长帧传输时累积的位偏移会导致采样点漂移到bit边界,出现误码。我一般要求设计时误差控制在1%以内。

那怎么办?要么换时钟频率,要么换波特率。比如用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基础回顾知识体系 UART通信基础 协议原理 帧格式 波特率计算 硬件接口 异步通信 TXD / RXD 起始位 数据位 停止位 分频系数 误差控制 TTL RS-232 RS-485 核心要点:异步通信无时钟线,靠波特率同步;帧格式必须收发一致;波特率误差控制在1%以内; 物理层选型根据距离和抗干扰需求决定。

好了,UART的基础知识就复习到这里。协议原理、帧格式、波特率计算、硬件接口——这四个方面你心里得有数。后面讲中断和DMA的时候,我会反复提到这些概念,尤其是波特率误差和帧格式配置,这两个是调优的起点。