4. 波特率与时钟同步:收发双方的默契
UART 通信,说白了就是两个人约好一个节奏,一个说,一个听。这个节奏,就是波特率。我见过不少新手,上来就调参数,结果数据全是乱码,最后发现是波特率没对上。嗯,这节我们就把它彻底讲透。
4.1 波特率到底是什么?
波特率(Baud Rate)定义的是每秒传输的符号数。在 UART 里,一个符号就是一个 bit,所以波特率就等于比特率。单位是 bps(bits per second)。
常见的波特率有这些:
| 波特率 (bps) | 位时间 (μs) | 典型应用场景 |
|---|---|---|
| 9600 | 104.17 | 调试终端、GPS 模块 |
| 19200 | 52.08 | 工业传感器、低速数传 |
| 38400 | 26.04 | 蓝牙模块、配置接口 |
| 115200 | 8.68 | 标准调试串口、Wi-Fi 模块 |
| 921600 | 1.09 | 高速数据采集、固件升级 |
你想想看,9600 和 115200 差了 12 倍。如果两边设的不一样,接收端采样的位置就全偏了,数据自然对不上。
4.2 位时间怎么算?
位时间,就是传输一个 bit 需要的时间。公式很简单:
位时间 (s) = 1 / 波特率 (bps)
举个例子:
- 9600 bps:1 / 9600 ≈ 0.00010417 s = 104.17 μs
- 115200 bps:1 / 115200 ≈ 0.00000868 s = 8.68 μs
这个时间有什么用?我告诉你,用逻辑分析仪抓波形的时候,你量一下一个 bit 的宽度,就能反推出实际波特率。我曾经遇到一个案子,板子上的晶振偏了,标称 115200,实际量出来只有 112000。要不是量了位时间,这问题查三天都查不出来。
4.3 收发双方的时钟误差容限
UART 是异步通信,收发双方没有共同时钟。接收端靠自己的时钟去采样 RX 线上的电平。问题来了:如果两边的时钟有偏差,采样点会逐渐漂移,漂到一定程度就采错了。
为什么会这样?因为接收端是在每个 bit 的中间位置采样的。假设发送端在 t=0 时发出起始位,接收端检测到下降沿后,等 1.5 个位时间(起始位中间 + 第一个数据位中间)开始采样第一个数据位。如果两边时钟完全一致,每次都能采在正中间。但如果接收端时钟偏快,采样点就会逐渐往前移;偏慢则往后移。
误差容限怎么算?我直接给结论:
| 数据位长度 | 理论最大误差 | 推荐安全值 |
|---|---|---|
| 8 位数据 + 无校验 | ±4.5% | ±2% |
| 8 位数据 + 偶校验 | ±4.0% | ±2% |
| 9 位数据 + 无校验 | ±4.0% | ±1.5% |
这个数字怎么来的?简单说,最后一个数据位的采样点离理想位置最远。如果误差太大,采样点可能滑出 bit 窗口,采到相邻 bit 上去。我个人的习惯是,设计时把误差控制在 ±1% 以内,这样不管用 8 位还是 9 位数据,都留足了余量。
4.4 时钟误差的来源
时钟误差主要来自三个方面:
- 晶振本身精度: 普通晶振 ±50ppm,高精度 ±10ppm。ppm 是百万分之一,±50ppm 对 115200 来说就是 ±5.76 bps,几乎可以忽略。
- 分频器整数限制: MCU 的系统时钟不一定能整除目标波特率。比如 16MHz 系统时钟,要产生 115200,分频系数 = 16MHz / (16 × 115200) ≈ 8.68,取整后实际波特率 = 16MHz / (16 × 8) = 125000,误差高达 8.5%,已经超出容限了。
- 温度漂移: 晶振和 RC 振荡器都会随温度变化。RC 振荡器尤其明显,温度每变化 10°C,频率可能漂 1%~2%。
4.5 用逻辑分析仪验证波特率
理论讲完了,来点实操。用逻辑分析仪抓一个 UART 波形,验证波特率对不对:
- 抓一段连续的 0x55 或 0xAA 数据。这两个字节的二进制是 01010101 和 10101010,波形是方波,最容易测量。
- 在逻辑分析仪上量一个 bit 的宽度。比如量出来是 8.5 μs,那实际波特率 = 1 / 8.5μs ≈ 117647 bps。
- 跟目标波特率 115200 对比,误差 = (117647 - 115200) / 115200 ≈ 2.1%。
- 如果误差超过 ±2%,就要检查时钟源或分频配置了。
我习惯在逻辑分析仪里直接设好波特率,让它自动解码。如果解码出来的数据全是错的,第一件事就是量位时间,而不是怀疑协议配置。这个顺序很重要。
4.6 知识结构图
下面这张图把波特率、位时间、误差容限和验证方法串起来了:
4.7 小结
波特率是 UART 通信的基石。记住三个关键点:
- 位时间 = 1 / 波特率,用逻辑分析仪量位时间是验证波特率最直接的方法。
- 时钟误差容限一般在 ±2%,超过这个范围就可能丢数据。
- 分频器取整误差是最大陷阱,选 MCU 时优先考虑带分数波特率发生器的型号。