013、UART工程陷阱:波特率误差、数据丢失、硬件流控配置与常见故障排查 UART工程陷阱:波特率误差、数据丢失、硬件流控配置与常见故障排查去年做一款工业数据采集器,MCU端用STM32F407,外接一个4G模组走UART通信。板子打样回来,第一轮测试就翻车——模组偶尔能回数据,大部分时间发AT指令石沉大海。示波器挂上去看波形,起始位、数据位、停止位都对,但MCU的RX引脚就是收不到完整数据包。折腾了两天,最后发现是波特率误差累积导致采样点偏移到了数据位的边缘。这种问题,教科书上写“误差需小于2%”,但实际工程里,晶振精度、分频系数、温度漂移叠加起来,2%根本不够用。波特率误差:那个让你怀疑人生的2%先讲个硬道理:UART是异步通信,收发双方各自用自己的时钟采样。发送端按设定的波特率把数据一位一位推出去,接收端用自己的时钟去采样RX线上的电平。如果两边时钟不同步,采样点就会逐渐偏移。STM32的USART波特率计算公式:Baud = fCK / (16 * USARTDIV),其中USARTDIV是一个16位寄存器,整数部分12位,小数部分4位。问题就出在这个小数部分——不是所有波特率都能用整数分频精确得到。比如用8MHz晶振配115200bps,理论分频系数是8000000/(16115200)=4.3403,寄存器只能写4.3125(4 + 5/16),实际波特率是8000000/(164.3125)=115942bps,误差0.64%。看起来不大,但连续传100个字节,累积误差就会吃掉半个位时间。真实案例:某项目用内部RC振荡器(精度±1%)跑72MHz,配921600bps高速UART。分频系数算出来是4.8828,寄存器写4.875,实际波特率72M/(164.875)=923076bps,误差0.16%。但RC振荡器随温度变化,实际频率可能掉到71.2MHz,此时实际波特率变成71.2M/(164.875)=912820bps,误差扩大到-0.96%。收发双方各漂1%,叠加起来接近2%,刚好踩在UART采样容限的临界点上。结果就是:常温调试没问题,现场40℃环境