串口乱码问题分析及解决方案

串口应该是嵌入式工程师使用最多的外设之一了吧,如果在使用串口的时候遇到乱码,大家是如何处理的呢?今天给大家分享一下我遇到串口乱码问题时的思路。

1.物理连接

关于所有的通信外设,物理连接是正常通信的基础,串口多用于板间通信,注意不同设备之间需要共地,且两个设备串口的两根通信线(TX和RX)交叉连接,如果物理连接出错,也可能导致串口乱码,所以在分析串口问题之前,首先保证连接的准确性。

2.波特率不同

这种是一种较为基础的情况,但是即使是经验丰富的工程师也是很难避免的错误,收发方波特率不一致,必然导致乱码,这种基础的情况如果及时发现,很快能得到解决,但是如果过于粗心,可能浪费大量时间调试寻找问题,在出现乱码时,先花一点时间检查下双方的波特率是否一致,可以避免出现浪费时间调试的尴尬情况,如果调不出来请大佬来帮忙看到是这种低级问题的时候,一定要装作无事发生,避免尴尬。

3.时钟导致

串口作为异步通信方式,它发出去的或者接收到的每一个bit宽度,都是根据自身时钟来做衡量的,如果在收发两端波特率相同的情况下接收到乱码,可以尝试检查自身时钟是否有问题。

软件配置带来的时钟问题:

关于时钟问题的排查,由于串口需要用自身时钟频率来计算波特率,但是芯片是不知道自身时钟频率的,所以芯片时钟频率值都是在工程配置文件内预设的,例如ST的:

所以我们先要保证串口的预设时钟值和使用的时钟频率值是一致的,如果不一致,计算出来的波特率和我们想设置的波特率差别过大也会导致乱码。

时钟异常导致:

一般时钟预设值是从手册或规格书上来的,当我们保持两者一致后仍然乱码,可以考虑下是否是时钟偏差导致。如果串口时钟整体偏差较大,导致的乱码应该是大部分的通信数据异常,如果出现极个别的数据异常,也不要马上排除时钟问题,可以尝试用示波器通过脉宽触发,抓一下是否时钟波形有个别周期异常。

4.干扰导致

如果TX和RX上有干扰,也可能会导致串口的乱码,且由于干扰的不稳定性,串口乱码可能只是出现在部分数据上。可以用示波器抓一下波形,看波形上是否有毛刺。如果串口本身硬件设计有检测干扰的机制,可以通过串口状态寄存器观察是否有相应标志位置起,例如STM32F030有噪声检测标志位:

5.外围电路导致

很多时候,为了增强抗干扰能力,会利用串口时序,外接485电路或其他的外围电路,有的应用为了做隔离,在485上还做了光耦隔离,此类电路导致的乱码现象千奇百怪,给大家提供一个思路,用示波器抓两个点的通信波形,一个是MCU的串口输出的IO口波形,另一个是经过外围电路转换后输出的波形。
上述总结都是我碰到的串口乱码问题的原因,如果各位有奇葩的串口乱码问题,也可以在评论区分享,大家共同探讨~

作者:一个人的嵌入式~

物联沃分享整理
物联沃-IOTWORD物联网 » 串口乱码问题分析及解决方案

发表回复