波特率只差一点,UART为何会整帧读错?
发表时间:2026-08-03 17:44:06
UART没有共享时钟。接收器识别起始沿后,用自己的波特率时钟推算每个位中心;收发周期只要存在偏差,采样相位就会逐位漂移。前几位可能仍落在有效区,帧尾却先越过边沿,最终表现为数据错位或停止位错误。
UART两端都设置成115200,逻辑分析仪也能解出起始位,可数据越到帧尾越容易错,偶尔还报停止位错误。把线缩短、换上拉或重发前几字节都没有根治。明确判断是:波特率误差不是每一位独立承受,而会在一帧内累积成采样漂移。
异步串口只借助起始沿对齐一次,之后依赖本地分频器推进采样点。晶振偏差、内部RC误差和整数分频取整都会进入周期误差。本文只讲这条时间路径,不把电平、反射和软件缓冲混成同一个故障。
没有时钟线,接收器怎样找到位中心?
空闲状态通常为高电平,接收器检测到下降沿后识别起始位。它不会在每个数据位重新等待边沿,而是按本地波特率时钟延时到预计的位中心,再依次采样数据位、校验位和停止位。
图1 TXD、RXD、分频器与过采样节点关系
过采样可以提高起始沿定位和抗短毛刺能力,但它仍基于本地时钟。16倍过采样并不代表波特率误差被消除;分频器每推进一位,周期偏差仍会累积到下一次采样位置。
为什么前几位对,最后几位先错?
假设接收端时钟稍快,它估算的每个位周期都偏短,采样点会逐位向前移动;接收端稍慢时,采样点则逐位向后移动。帧越长,最后一个数据位和停止位积累的相位偏差越大。
图2 8N1帧中位中心随周期误差逐位漂移
数据内容也影响可见性。连续相同电平没有中间边沿,采样点即使移动也不容易从波形上察觉;位型频繁翻转时,采样点靠近边沿就更容易读到相邻位。固定发送0x55或0xAA常有助于观察边沿与采样中心。
起始位识别成功只证明帧头对齐,不能证明帧尾采样仍在位中心。
标称115200为什么还会有实际误差?
MCU通常用外设时钟除以整数或有限精度分数得到目标波特率。若目标值无法被准确分频,寄存器只能选择最接近的结果。发送端和接收端各自还有晶振精度、温漂和电源变化,最终误差是两端相对偏差。
图3 UART时钟、TXD/RXD与测试点的版图检查
使用内部RC时钟的低成本节点更要关注温度和校准条件。数据手册可能给出典型精度、保证范围或校准后的范围,不能拿室温实测的一次频率代表全温区。
· 分频取整:计算寄存器对应的实际波特率。
· 时钟精度:覆盖两端晶振或RC的误差方向。
· 帧格式:数据位、校验位和停止位共同决定累计长度。
怎样做一个可归因的波特率实验?
保持线路、电平、帧格式和数据内容不变,只调整一端分频值。用逻辑分析仪量起始位宽和多个连续位宽,在帧头与帧尾标出接收器预计采样中心,观察错误出现位置是否随分频值稳定移动。
再交换误差方向。如果接收端稍快时错误向帧尾前侧移动,稍慢时向后侧移动,现象与累积漂移相符。若错误只出现在固定电压或线长下,则应转向阈值、反射或噪声路径,而不是继续改波特率。
图4 基线与单一分频变量下的采样裕量
1. 固定测试字节优先使用边沿丰富的重复位型。
2. 只改一端分频保存实际波特率而非只写标称值。
3. 标记帧头帧尾比较采样中心离边沿的距离。
提高过采样倍数能彻底解决吗?
更高过采样有助于检测起始沿、做多数表决或抑制短干扰,但不能让两个独立时钟自动同频。若总相对误差过大,采样点仍会在长帧后段跨过边界。
可靠方案是按目标MCU时钟树计算实际分频,选择精度合适的时钟源,并覆盖温度、电压与帧格式。若协议允许,也可通过周期性重新同步或更强的时钟恢复机制降低长时间漂移,但那已不是普通UART的单帧行为。
UART可靠性的时间证据是最坏相对波特率误差下,帧尾采样点仍留在有效位中心范围内。
结论
串口前几位正常、帧尾先错时,把关注点从“软件有没有收到起始位”移到“实际位周期差了多少”。测出真实分频结果,往往比反复改延时更直接。
如果停止位错误只在高温或低压出现,记得把两端时钟误差按最坏方向相加,而不是各自只看典型值。
你的错误集中在帧尾、特定位型,还是只在内部RC时钟和高温条件下出现?






哔哩哔哩
微信公众号
小红书
抖音
知乎
西瓜视频
头条
微信视频号