串口通讯到底有没有累积误差?对时钟精度到底有何要求?

1. 问题背景:

对于嵌入式开发者来说,串口应该是应用最广泛的模块,在日常客户支持过程中经常会有客户问到一些关于串口通讯稳定性的问题,比较典型的几个问题如下:

  • 在9600波特率能工作,但切换到115200就无法正常通讯,是不是和时钟精度有关系?

  • 串口稳定通讯对时钟精度的要求是多少,是否波特率配置越高对时钟精度要求就越高?内部RC能否满足?

  • 串口正常通讯了一段时间后通讯出错,是不是因为累计误差太大了?

尽管网上铺天盖地的串口配置的资料,但对这些具体问题的描述确实不多,于是好好研究了一番。

2. 问题分析:

EE芯视频推荐

视频:从0学Linux驱动-如何同时支持多个次设备-16

想回答这些问题还要从串口通讯的采样时序说起,如上图所示,根据串口的采样特点不难看出,对于发送端来说,数据是在上升沿被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通讯,以上结论也基本适用;

  • 以上结论仅从采样时序的角度分析,不考虑外界电磁干扰的影响,因为通常波特率越高,每位数据的时间长度越短,就越容易受到电磁干扰从而导致通信不可靠。

     

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值