串口
通信中,如果不需要校验位的话,一般格式是:1bit起始位+8bit数据位+1bit停止位。
现在A 和 B按照串口规定的波特率进行通信,假设是9600,且 A是发送,B是接受。
B采用9600的16倍时钟去采样。由于是异步通信,且时钟也不是完全精确的。B的接收可能存在偏移。
请问这种偏移是否是累加的?即A连续发送,上一轮的停止位刚发送完,立刻发送下一轮的起始位。在这样反复发送了非常多轮后,累计起来的误差是否会导致B接收数据错误?
如果B在接收数据时,到接收停止位的时候,并不完全持续一个停止位的时间长度,而是提前就进入等待下一轮起始位的状态,这样做符合通用的做法吗?
应用的情景是A连续发送。发完上一轮的停止位立刻发下一轮的起始位。起始位的检测是独立的。作为接收方B来说,检测每一位的时间t0(t0 = 1/9600)是固定的。假设t0是精确的。
所以B的一次完整接收周期是t0*(1+8+1)。假设A连续发送,如果B检测到有数据的时间滞后了t_delay时间,则每一轮检测都滞后t_delay。
这样不会有错。累积的后果也就是,每一轮B晚t_delay接收到数据,而每一轮B接收数据花的时间是等同于A发送所用的时间长度的。
但如果B的时钟并不是精确的,比如略长于t0。那每一轮都会消耗更多的时间。这个多消耗的时间,举个例子说明:
B还在接收第n轮的停止位,A已经开始发送n+1轮的起始位了。
而由于每一轮B接收数据, 都花了长于A发送所用的时间,那多次累加下来,就会出现错误了。比如B还在接收第n轮的停止位,A已经在发送第n+1轮的数据了。这样B就会丢数据。
请问这样的理解是对的吗?
说的有道理。所以uart协议中还存在1.5个停止位和2个停止位的模式
一周热门 更多>