通讯原理
UART(Universal Asynchronous Reciver/Transmitter),通用异步收发器,异步通讯说明无时钟信号,通过检测数据包中的起始位和停止位来接收数据,数据通信格式如下:
图1:UART数据通信格式
起始位 | 数据位 | 奇偶校验位 | 停止位 |
---|---|---|---|
1 bit(低电平) | 通常为1Byte | 1 bit(可选) | 1 bit(高电平) |
波特率与时钟的关系
时钟因子 = 时钟频率 / 波特率 = 时钟频率 * 位周期
波特率:在1个单位时间内能传输的数据量(单位bit)
位周期:传输一个bit数据所需的时间
时钟因子:设置波特率时的时钟分频系数
波特率偏差
当收发端波特率存在轻微偏差(±4%左右,具体需要根据波特率进行实验测试)时,UART仍可正确通讯,其原理如下(数据格式以 1 bit 起始位 + 8 bit 数据位 + 1 bit 停止位 为例):
波特率 = 1 / 位周期
- 当收发端波特率相同时(Baud),位周期也相同,接收端根据当前位周期 T r x T_{rx} Trx对接收到的数据进行采样接收,采样点将正好落在每1 bit数据的中心,即采样周期 T s T_s Ts=位周期 T r x T_{rx} Trx=位周期 T t x T_{tx} Ttx,如图一所示,此时能够保证每1 bit数据都能够正确采样,即整个数据正确接收。
- 当发送端波特率出现偏差时(Baud '),位周期发生变化,接收端位周期Trx保持不变,接收端根据当前采样周期
T
s
T_s
Ts(
T
s
=
T
r
x
T_s = T_{rx}
Ts=Trx)对接收到的数据进行采样接收,此时采样点与所接收数据中心并不完全对应(
T
t
x
≠
T
s
T_{tx} \neq T_s
Ttx=Ts)。
图2:采样偏差( Δ T = T t x − T s \Delta T = T_{tx} - T_s ΔT=Ttx−Ts)
-
与位周期有关,当接收端采样周期Ts小于发送端位周期Ttx时,采样点偏左;反之偏右。此时采样每1 bit数据时均存在些许采样偏差 Δ T \Delta T ΔT,当传输整个数据(8 bit)累积偏差( 8 × Δ T 8 \times \Delta T 8×ΔT)超过半个发送端位周期( 1 2 × T t x \frac{1}{2} \times T_{tx} 21×Ttx)时,数据采样将发生错误,此时整个数据不能够正常接收。
-
值得注意的是,每次接收数据采样点均会从第1 bit 数据初始化,这意味着采样偏差并不会累积至下一次数据传输,如图1所示,每次检测到下降沿时将重新开始进行数据采样。
因此,理论上发送一个字节数据(8 bit数据,不包含起始位和停止位)接收端采样累积偏差( 8 × Δ T 8 \times \Delta T 8×ΔT)不超过发送端位周期 T t x T_{tx} Ttx的50%则数据能够正确发送接收。
结论:能否成功通讯与单个数据的数据长度和收发端相对位周期偏差有关。
参考链接:https://baijiahao.baidu.com/s?id=1633378965807142906&wfr=spider&for=pc