代码里写的9600,串口助手也设的9600,出来的全是乱码。先别怀疑波特率,真正的凶手往往是别的东西。

第一嫌疑人:时钟源不准
MCU的波特率由时钟分频产生。很多MCU默认用内部RC振荡器,精度只有正负1%到2%。9600波特率下,1%的误差就可能让接收端采样点偏移,直接读错数据位。
解决办法:切换到外部晶振,或在代码里手动写UART分频寄存器,补偿时钟偏差。
第二嫌疑人:数据格式不匹配
波特率只是八个参数中的一个。数据位、停止位、校验位,任何一项对不上都会乱码。
最常见的坑:代码设了8N1,串口助手选了8E1。多一个校验位,每帧数据都错位,出来的必然是乱码。
第三嫌疑人:非标准波特率
9600、115200这些是标准值,分频后误差为零。但115200以上的波特率,比如256000、460800,很多MCU无法精确分频,实际波特率会偏移2%到3%。
接收端一采样就错位,看起来就像乱码。
第四嫌疑人:硬件层的问题
TX和RX接反了,这是最经典的错误。还有共地没接,两个设备参考电平不一致,信号识别全靠猜。
另外,电平不匹配也会导致问题。3.3V的MCU直接接5V的RS232模块,信号畸变,数据自然读不对。
排查顺序建议
先查数据格式是否一致,再查时钟源是否准确,然后用示波器看TX波形确认实际波特率,最后检查接线和电平。
本文凡亿教育原创文章,转载请注明来源!

扫码关注








































