对于嵌入式开发者来说,串口应该是应用最广泛的模块,在日常客户支持过程中经常会有客户问到一些关于串口通讯稳定性的问题,比较典型的几个问题如下:
尽管网上铺天盖地的串口配置的资料,但对这些具体问题的描述确实不多,于是好好研究了一番。
想回答这些问题还要从串口通讯的采样时序说起,如上图所示,根据串口的采样特点不难看出,对于发送端来说,数据是在上升沿被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是一个异步通讯,通讯的稳定性取决于双方的时钟精度,不是说只有一方的精度满足要求,系统就能正常工作,所以需要系统去考虑。
基于以上的分析,可以得出结论如下:
串口稳定通讯和双方的时钟精度和有关,总误差不能超过±4.16%,对于大部分全温度范围±1%的MCU来说,都能满足基本的通讯需求。
串口通讯的累计误差发生在每次数据(也可以简单理解成每个字节,只是字节不严谨,因为有时数据可能是9 bits)发送内部,连续的多次发送之间没有累计误差,因为连续的多个字节发送都会被Start起始信号进行重新同步,也就是说传输1个字节的误差和传输1000个字节的误差基本差不多;
串口是否稳定通讯和波特率大小无关,并非波特率配置越高对时钟精度要求就越高,只和每次发送的串口数据长度(包含起始位/数据位/奇偶校验位/停止位长度)有关, 位长越长,对时钟精度要求越高;
对于使用串口实现的LIN通讯,以上结论也基本适用;
以上结论仅从采样时序的角度分析,不考虑外界电磁干扰的影响,因为通常波特率越高,每位数据的时间长度越短,就越容易受到电磁干扰从而导致通信不可靠。
觉得有用,点赞、在看支持下吧。