1. 问题背景:
对于嵌入式开发人员而言,串口模块是最常用的功能之一。在日常客户支持过程中,经常会遇到一些关于串口通信稳定性的问题,以下是几个典型问题的描述:
-
在9600波特率下可以正常工作,但切换到115200波特率后无法进行正常通信,是否与时钟精度有关? -
串口通信的稳定性与时钟精度之间有何要求?波特率设置越高,对时钟精度的要求是否越高?内部RC时钟能否满足需求? -
在一段时间后,串口通信正常运行的情况下出现通信错误,是由于累计误差导致的吗?
尽管网络上有很多关于串口配置的资料,但对于这些具体问题的描述却相对较少。因此,经过深入研究后我将针对这些问题进行相关探讨。
2. 问题分析:
想回答这些问题还要从串口通讯的采样时序说起,如上图所示,根据串口的采样特点不难看出,对于发送端来说,数据是在上升沿被drive到总线上,接收端在每个bit的中间位置采样,这就意味着在最后一个Bit位采样时,允许极限偏移为50%,假如用1个起始位+9个数据位+1个奇偶校验位+1个停止位来计算,那么每位偏差最高为:
±50% / 12 = ±4.16%
“
Note: 对于有些支持过采样的串口来说,采样点可能不是50%中间位置,一般会更靠后,此处不展开讨论;
假如用1个起始位+8个数据位+1个停止位来计算,那么每位偏差最高为:±50% / 10 = ±5%
”
而串口通信,要涉及到发送和接收两端,当一端为0误差,另一端最大误差可到4.16%,如果两端误差相同,那每端的最大误差就只能是2.08%,这也就是为什么很多硬件老法师建议串口的波特率误差控制在2%以内。
±4.16% / 2 = ±2.08%
因此,对于串口通信来说,可以粗略认为,当时钟误差小于±2%时,通信是比较可靠的。对于客户实际的应用系统,考虑到UART是一个异步通讯,通讯的稳定性取决于双方的时钟精度,不是说只有一方的精度满足要求,系统就能正常工作,所以需要系统去考虑。
3. 总结:
基于以上的分析,可以得出结论如下:
-
串口稳定通讯和双方的时钟精度和有关,总误差不能超过±4.16%,对于大部分全温度范围±1%的MCU来说,都能满足基本的通讯需求。 -
串口通讯的累计误差发生在每次数据(也可以简单理解成每个字节,只是字节不严谨,因为有时数据可能是9 bits)发送内部,连续的多次发送之间没有累计误差,因为连续的多个字节发送都会被Start起始信号进行重新同步,也就是说传输1个字节的误差和传输1000个字节的误差基本差不多; -
串口是否稳定通讯和波特率大小无关,并非波特率配置越高对时钟精度要求就越高,只和每次发送的串口数据长度(包含起始位/数据位/奇偶校验位/停止位长度)有关, 位长越长,对时钟精度要求越高; -
对于使用串口实现的LIN通讯,以上结论也基本适用; -
以上结论仅从采样时序的角度分析,不考虑外界电磁干扰的影响,因为通常波特率越高,每位数据的时间长度越短,就越容易受到电磁干扰从而导致通信不可靠。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !