2、UART基础原理:异步串行通信、数据帧格式、波特率定义
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是嵌入式系统中最基础、最广泛使用的串行通信接口之一。无论是调试串口、GPS模块、蓝牙模块,还是与PC进行数据交互,UART都扮演着不可替代的角色。理解UART的底层原理,是进行通信协议设计、驱动开发和故障排查的基石。本章将深入剖析异步串行通信的机制、数据帧的每一位含义,以及波特率如何决定通信速率与误差容限。
2.1 异步串行通信的核心机制
UART是一种异步通信方式,这意味着收发双方不共享时钟信号。与I2C或SPI同步通信不同,UART发送端和接收端各自使用独立的时钟源,通过约定相同的波特率来保证数据采样的同步性。这种设计使得UART只需要两根信号线(TX发送、RX接收)加上一根地线(GND)即可完成全双工通信,硬件开销极低。
异步通信的关键在于帧同步。当线路处于空闲状态时,TX线保持高电平。发送端要发送数据时,首先拉低电平一个位时间,产生一个下降沿,这个下降沿就是接收端开始采样的“启动信号”。接收端检测到下降沿后,按照约定的波特率,在每个位时间的中间点对RX线进行采样,从而恢复出数据位。
2.2 数据帧格式详解
一个标准的UART数据帧由起始位、数据位、校验位(可选)和停止位组成。以最常见的8N1格式(8个数据位、无校验、1个停止位)为例,完整帧结构如下:
| 字段 | 位宽 | 电平状态 | 作用说明 |
|---|---|---|---|
| 空闲态 | — | 高电平(1) | 线路空闲标识,无数据传输 |
| 起始位 | 1 bit | 低电平(0) | 标志数据帧开始,触发接收端同步 |
| 数据位 | 5~9 bit | 0 或 1 | 实际有效数据,通常LSB先发送 |
| 校验位 | 0~1 bit | 0 或 1 | 奇偶校验,用于简单错误检测(可选) |
| 停止位 | 1~2 bit | 高电平(1) | 标志帧结束,保证下一帧起始位有下降沿 |
数据位通常采用LSB First(最低有效位先行)方式发送。例如发送十六进制0x55(二进制01010101),实际在线上先发送最低位1,然后依次是0、1、0、1、0、1、0,最后发送最高位0。停止位必须为高电平,这是为了确保下一帧的起始位(低电平)能够产生一个明显的下降沿,供接收端检测。
2.3 波特率定义与误差分析
波特率(Baud Rate)定义为每秒传输的码元数量,单位是bps(bits per second)。在UART中,由于每个码元携带1比特信息,波特率与比特率数值相等。常见波特率有9600、19200、38400、115200等。波特率决定了每一位的持续时间:位时间 = 1 / 波特率。例如115200bps时,每位约8.68微秒。
收发双方的波特率必须一致,但实际系统中晶振误差、分频器精度会导致波特率存在偏差。UART接收端通常以16倍波特率的时钟采样,只要在起始位下降沿后的第8个采样点(即位中心)能正确读取数据位,且误差累积不超过半个位时间,通信就能正常进行。工程上要求波特率误差控制在±2%以内,对于115200bps,允许的误差约为±2304bps。
2.4 实战场景:串口通信参数不匹配的排障
场景背景:某物联网项目使用ESP32通过UART与NB-IoT模组(型号BC26)通信。开发人员配置ESP32的UART2波特率为115200,但模组默认波特率为9600。设备上电后,ESP32发送AT指令无任何响应。
排查过程:
- 初步检查:使用逻辑分析仪抓取ESP32 TX引脚波形,发现数据帧位宽约8.68μs,确认ESP32确实以115200bps发送。
- 对比分析:查阅BC26模组数据手册,确认其默认波特率为9600,且支持自动波特率检测(需发送特定字符"AT"触发)。
- 关键判断:由于波特率不匹配,模组无法正确解析起始位和数据位,导致无响应。
- 解决方案:将ESP32的UART波特率改为9600,重新上电后发送"AT",模组返回"OK"。
- 结果验证:通信恢复正常,后续指令交互均成功。
复盘经验:在连接任何UART设备前,务必确认双方波特率、数据位、校验位、停止位完全一致。对于支持自动波特率检测的模组,可先发送特定字符(如"AT")让模组自适应,但需注意模组在未检测到波特率前不会响应其他指令。
2.5 常见误区与设计建议
- 误区一:认为UART是全双工就必须使用4根线。实际上全双工只需TX和RX两根独立数据线,加上GND共地即可。
- 误区二:忽略校验位的作用。奇偶校验只能检测奇数个位错误,无法纠错,且会降低有效数据吞吐量。在噪声较大的工业环境中,建议使用更可靠的CRC校验(需在协议层实现)。
- 误区三:将波特率设置得越高越好。高波特率对线材质量、连接方式(杜邦线 vs 焊接)、电平标准(TTL vs RS232)都更敏感。超过460800bps时,建议使用RS485或LVDS差分传输。
- 设计建议:在PCB布局中,UART信号线应尽量短且远离高频干扰源(如DC-DC电感、晶振)。若使用排线连接,建议在TX/RX线上串联33Ω~100Ω电阻以抑制振铃。