1. UART基础概念:从一根线说起

各位同学好,我是老周。做嵌入式这行快十五年了,调试过的串口问题少说也有上百个。今天咱们开始聊UART——这个看起来最简单、但坑最多的通信接口。

UART的全称是Universal Asynchronous Receiver/Transmitter,通用异步收发器。说白了,它就是让两个设备之间用一根线(或者两根线)互相说话的一种方式。我刚开始学嵌入式时,觉得这东西太简单了,不就是发数据收数据嘛。结果后来在项目里被它折腾得够呛——信号干扰、波特率对不上、帧格式配错,各种问题。

所以这一章,咱们把UART的底裤扒干净。你理解了基础,后面调试才能有的放矢。

1.1 什么是UART

UART是一种硬件模块,它把并行数据转成串行数据发出去,再把收到的串行数据转回并行。你想想看,MCU内部处理数据都是8位、16位、32位并行的,但传输线只有一根,怎么办?

答案就是:串行化。

核心要点:UART的本质是并行→串行→并行的转换器。它不需要时钟线,靠双方约定好的速率(波特率)来同步。

我在一个工业控制项目里遇到过这种情况:设备A和设备B距离30米,用UART通信。一开始用的9600波特率,数据偶尔出错。后来降到2400,稳如老狗。为什么?距离长了,信号衰减和干扰就上来了,速率越高越容易出错。这个经验后面会细讲。

1.2 异步通信原理

异步通信,说白了就是没有专门的时钟线。发送方和接收方各自用自己的时钟,但必须约定好相同的速率。

你可能会问:没有时钟线,接收方怎么知道什么时候开始读数据?

答案是:起始位。

UART一帧数据的结构是这样的:

字段 长度 说明
起始位 1位 拉低电平,告诉接收方“我要开始发了”
数据位 5~9位(常用8位) 实际要传输的数据,LSB先发
校验位 0或1位 奇校验/偶校验/无校验
停止位 1~2位(常用1位) 拉高电平,表示一帧结束

接收方一直在检测电平变化。当它发现电平从高变低(下降沿),就知道发送方要开始传数据了。然后按照约定的波特率,在每个数据位的中间采样一次。

经验之谈:我曾经调试过一个设备,数据总是错位。查了半天,发现是停止位设置成了2位,但接收方只等了1位。两边配置不一致,数据就全乱了。所以通信双方的数据帧格式必须完全一致,这是铁律。

1.3 串行与并行通信对比

咱们做个对比,你就明白为什么嵌入式系统里串行通信这么流行了。

对比项 串行通信 并行通信
传输线数量 1~2根 8~32根
传输距离 远(几十米) 近(几米以内)
抗干扰能力 强 弱(线间串扰严重)
硬件成本 低 高
传输速率 相对较低 高(但受限于距离)
典型应用 UART、SPI、I2C LCD数据总线、存储器接口

你看,串行通信虽然一次只传1位,但胜在简单、省钱、抗干扰。我做过一个项目,设备分布在厂房各个角落,用并行通信根本不可能——线太多,干扰太大。最后全部改用RS-485(基于UART),一根双绞线搞定。

1.4 UART在嵌入式系统中的地位

这么说吧,UART是嵌入式系统的生命线。

  • 调试输出:printf打印日志,全靠UART。没有它,你连程序跑没跑起来都不知道。
  • 协议交互:GPS模块、蓝牙模块、Wi-Fi模块、4G模块,几乎全部用UART通信。
  • 固件升级:很多MCU的Bootloader通过UART接收新固件。
  • 人机交互:串口屏、串口打印机,都是UART的天下。

注意:UART本身只定义了物理层的电气特性和数据帧格式,不定义协议。你传什么数据、怎么解析,那是应用层的事。很多初学者把UART和RS-232、RS-485搞混——UART是协议/模块,RS-232/485是电气标准,别弄错了。

我见过一个团队,产品量产了才发现UART通信偶尔丢数据。查到最后,是中断优先级没配好,数据来了没及时读走,被覆盖了。这种问题,如果你不理解UART的底层原理,根本想不到。

1.5 本章知识结构图

下面这张图把UART的核心概念串起来了,你对照着看,心里就有谱了。

UART核心概念体系 UART通用异步收发器 异步通信原理 无时钟线 · 起始位同步 数据帧格式 起始位+数据位+校验位+停止位 串行通信 一根线传所有位 波特率约定 电平采样时机 LSB先发 空闲状态为高电平 抗干扰能力强 传输距离远 嵌入式系统调试与通信的核心接口 理解UART = 掌握嵌入式通信的基石

1.6 小结

这一章咱们把UART的底子打好了:

  • UART是并行转串行的硬件模块
  • 异步通信靠起始位和约定波特率来同步
  • 串行通信比并行通信更远、更省线、更抗干扰
  • UART是嵌入式系统的调试口、通信口、升级口