本帖最后由 mengtu123 于 2022-4-21 17:17 编辑
串口应该是应用广泛的功能,关于串口通讯稳定性的问题,比较常遇到的几个问题如下:
- 在9600波特率能工作,但切换到115200就无法正常通讯,是不是和时钟精度有关系?
- 串口稳定通讯对时钟精度的要求是多少,是否波特率配置越高对时钟精度要求就越高?内部RC能否满足?
- 串口正常通讯了一段时间后通讯出错,是不是因为累计误差太大了?
要解决这些问题需要从串口通讯的采样时序解析,如上图所示,根据串口的采样特点,对于发送端来说,数据是在上升沿被drive到总线上,接收端在每个bit的中间位置采样,这就意味着在最后一个Bit位采样时,允许极限偏移为50%. 假如用1个起始位+9个数据位+1个奇偶校验位+1个停止位来计算,那么每位偏差最高为:±50% / 12 = ±4.16% 假如用1个起始位+8个数据位+1个停止位来计算,那么每位偏差最高为:±50% / 10 = ±5% 而串口通信,要涉及到发送和接收两端,当一端为0误差,另一端最大误差可到4.16%,如果两端误差相同,那每端的最大误差就只能是2.08%,±4.16% / 2 = ±2.08% 因此,对于串口通信来说,可以粗略认为,当时钟误差小于±2%时,通信是比较可靠的。对于客户实际的应用系统,考虑到UART是一个异步通讯,通讯的稳定性取决于双方的时钟精度,不是说只有一方的精度满足要求,系统就能正常工作,所以需要系统去考虑。 基于以上的分析,可以得出结论如下: 串口稳定通讯和双方的时钟精度和有关,总误差不能超过±4.16%。 串口通讯的累计误差发生在每次数据发送内部,连续的多次发送之间没有累计误差,因为连续的多个字节发送都会被Start起始信号进行重新同步,也就是说传输1个字节的误差和传输1000个字节的误差基本差不多; 串口是否稳定通讯和波特率大小无关,并非波特率配置越高对时钟精度要求就越高,只和每次发送的串口数据长度(包含起始位/数据位/奇偶校验位/停止位长度)有关, 位长越长,对时钟精度要求越高; 对于使用串口实现的LIN通讯,以上结论也基本适用; 以上结论仅从采样时序的角度分析,不考虑外界电磁干扰的影响,因为通常波特率越高,每位数据的时间长度越短,就越容易受到电磁干扰从而导致通信不可靠。
|