2. 波特率本质:比特率、时钟分频与常用标准
波特率,说白了就是 UART 通信的“心跳”。
很多初学者容易把波特率和比特率搞混。我刚开始做嵌入式时也犯过这个错——以为 9600 波特就是每秒传 9600 个 bit。后来调一个串口屏,死活显示不对,查了半天才发现是概念理解有偏差。
2.1 波特率 vs 比特率:一字之差,天壤之别
先给个最直白的定义:
- 波特率(Baud Rate):每秒传输的符号个数。
- 比特率(Bit Rate):每秒传输的比特个数。
在 UART 里,每个符号只携带 1 个比特信息(起始位、数据位、校验位、停止位都是独立符号)。所以数值上,波特率 = 比特率。但如果你用 QPSK 或 16QAM 这种调制方式,一个符号能带 2 个、4 个甚至更多比特,那两者就不相等了。
核心公式:
比特率 = 波特率 × log₂(每个符号携带的比特数)
UART 场景下,log₂(1) = 1,所以比特率 = 波特率。
我习惯在项目文档里直接写“波特率 115200”,因为 UART 工程师都懂。但如果你跟做射频的同事对接,一定要说清楚是波特率还是比特率——他们用的调制方式复杂,容易混淆。
2.2 时钟分频原理:波特率是怎么“算”出来的?
MCU 的主频通常是几十 MHz 甚至上百 MHz。但 UART 要的是 9600、115200 这种“慢节奏”。怎么办?分频。
分频的本质就是:用计数器把高频时钟“切”成低频时钟。
举个例子。假设系统时钟是 16 MHz,你想得到 115200 的波特率。UART 外设内部有一个波特率发生器,它做这样一件事:
分频系数 = 系统时钟频率 / (目标波特率 × 采样倍数)
常用采样倍数:
- 传统 UART:16 倍采样
- 高速 UART:8 倍采样或 4 倍采样
计算示例(16 倍采样):
分频系数 = 16,000,000 / (115200 × 16) = 8.68 → 取整为 9
实际波特率 = 16,000,000 / (9 × 16) = 111,111 bps
误差 = (111,111 - 115,200) / 115,200 ≈ -3.5%
注意:分频系数取整会引入误差。UART 协议要求波特率误差在 ±2% 以内(有些芯片放宽到 ±3%)。上面 3.5% 的误差已经超标了,通信会丢包。
我曾经在一个项目中用了 16 MHz 晶振配 115200 波特率,结果分频后误差 3.5%,设备每隔几分钟就乱码一次。后来换成 14.7456 MHz 晶振,误差降到 0.1%,问题解决。
为什么会这样?因为 115200 这个数字不是随便定的。它跟 1.8432 MHz、14.7456 MHz 这些“魔法频率”有整数倍关系。你想想看:
14,745,600 / (115200 × 16) = 8.0 → 整数分频,零误差
所以很多工业级串口板子都爱用 14.7456 MHz 晶振。这不是巧合,是数学。
2.3 常用波特率标准:9600、115200、921600
这三个数字是 UART 世界里的“三剑客”。我按使用场景给你拆开讲。
| 波特率 | 典型场景 | 有效数据速率 | 线长(典型) |
|---|---|---|---|
| 9600 | 工业传感器、PLC、老旧设备 | 约 960 字节/秒 | 15~30 米 |
| 115200 | 调试串口、GPS 模块、蓝牙模块 | 约 11.5 KB/秒 | 3~5 米 |
| 921600 | 高速数据采集、固件升级 | 约 92 KB/秒 | 1~2 米 |
9600 为什么还活着?
很多工业现场总线(如 Modbus RTU)默认就是 9600。原因很简单:抗干扰。波特率越低,每个 bit 的时间窗口越长,噪声毛刺不容易被误判。我在一个工厂调试时,现场电机一启动,115200 就乱码,降到 9600 稳如老狗。
115200 是调试标配。
几乎所有 MCU 的 Bootloader 都支持 115200。它是个平衡点——速度够快(刷固件不煎熬),又不需要太好的线材。我习惯把所有调试串口都设成 115200,8N1,省心。
921600 是“飙车”模式。
这个速率下,1 秒能传约 90 KB 数据。适合批量日志输出或 OTA 固件升级。但要注意:
- 线长别超过 2 米,否则信号反射会让你怀疑人生。
- MCU 的主频要够高,否则中断响应不过来会丢数据。
- USB 转串口芯片(如 CH340、CP2102)要选支持 921600 的型号。
我的经验:如果你不确定用哪个波特率,先上 115200。绝大多数场景都能跑。如果通信距离超过 10 米,降到 38400 或 19200。如果刷固件嫌慢,临时切到 921600,刷完再切回来。
2.4 知识结构图:波特率配置全流程
下面这张图把波特率从晶振到最终通信的完整链路画出来了。你可以对照着理解。
2.5 避坑指南:波特率配置常见问题
做 UART 调试这么多年,我踩过的坑不少。挑几个典型的说说:
- 晶振选错,全盘皆输。 我见过有人用 12 MHz 晶振配 115200,分频系数算出来是 6.51,取整后误差 4.2%。结果就是通信时好时坏。后来换成 14.7456 MHz,一切正常。
- 采样倍数别乱改。 有些芯片支持 16 倍、8 倍、4 倍采样。采样倍数越低,对时钟精度要求越高。16 倍采样能容忍 ±2% 误差,4 倍采样只能容忍 ±0.5%。除非你确定晶振很准,否则别省这个。
- 两边波特率要“真”一致。 两边都配成 115200 不代表实际波特率一样。如果两边晶振不同,分频误差可能一个正一个负,叠加起来就超标了。我习惯用示波器量一下 TX 脚的 bit 宽度,确认两边一致。
- USB 转串口有“虚标”。 有些便宜的 USB 转串口线标称支持 921600,实际跑起来丢包严重。我踩过这个坑,后来只用 FT232 和 CP2102 的芯片。
一句话总结:波特率配置的核心就三件事——选对晶振、算对分频、确认误差。这三步走稳了,UART 通信就成功了一半。