最近用新唐 N76E003 做串口通讯,和上位机传输数据,波特率 9600bps,调试的时候频繁出现乱码、丢包,花了好几天才定位到问题,给大家分享一下排查过程。
首先怀疑是硬件干扰,用示波器看了串口波形,发现 RX 引脚上有很多高频杂波,波形边沿畸变很严重。原来布线的时候,串口线和电机驱动线靠得太近,电机启停的电磁干扰串进了串口信号里。后来把串口线改成了屏蔽线,并且远离功率走线,再给 RX 引脚加了 RC 滤波,杂波明显减少了。还有电源纹波也很大,后来给 MCU 供电加了磁珠和电容滤波,电源稳定了,通讯也稳了很多。
然后是波特率误差的问题。新唐 N76E003 的串口波特率是由定时器分频得到的,我一开始用的是内部 16MHz IRC 时钟,没校准,实际波特率和标准值偏差超过了 3%,超出了串口的容错范围,导致采样错位,出现乱码。后来换成了 11.0592MHz 的外部晶振,分频后波特率误差几乎为 0,乱码问题直接解决了。
软件上也有个坑,一开始我把串口接收中断里写了太多业务逻辑,数据校验、指令解析都放在中断里,导致中断执行时间太长,新的数据来了没及时处理,就丢包了。后来把中断里的逻辑精简,只做数据存入缓冲区,解析和处理都放到主循环里,丢包率直接降到了 0。还有缓冲区大小,一开始设的是 32 字节,上位机发长数据的时候缓冲区溢出,后来改成了 128 字节,就没再溢出过。
现在这个串口通讯已经连续跑了一周,高低温测试也没出问题。串口通讯看似简单,但是硬件干扰、波特率误差、中断处理这些细节,一个没做好就会翻车。
|
|