串口通信.停止位时间长度可以小于协议规定吗?

2019-07-15 22:59发布

串口通信中,如果不需要校验位的话,一般格式是:1bit起始位+8bit数据位+1bit停止位。
现在A 和 B按照串口规定的波特率进行通信,假设是9600,且 A是发送,B是接受。


B采用9600的16倍时钟去采样。由于是异步通信,且时钟也不是完全精确的。B的接收可能存在偏移。

请问这种偏移是否是累加的?即A连续发送,上一轮的停止位刚发送完,立刻发送下一轮的起始位。在这样反复发送了非常多轮后,累计起来的误差是否会导致B接收数据错误?

如果B在接收数据时,到接收停止位的时候,并不完全持续一个停止位的时间长度,而是提前就进入等待下一轮起始位的状态,这样做符合通用的做法吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
小梅哥
1楼-- · 2019-07-15 23:47
 精彩回答 2  元偷偷看……
小梅哥
2楼-- · 2019-07-16 05:31
对于FPGA设计的串口模块来说,由于起始位检测是独立的,并不是连续的波特率,而是检测到起始位了才开始产生波特率时钟,即每个字节都会进行波特率校正。所以不会有问题
uuyuanuu
3楼-- · 2019-07-16 07:54
诺 其实视频里有讲这个问题 小梅哥视频 你不二选择
月亮下的蛋
4楼-- · 2019-07-16 11:37
本帖最后由 月亮下的蛋 于 2016-3-20 17:40 编辑
小梅哥 发表于 2016-3-20 16:54
对于FPGA设计的串口模块来说,由于起始位检测是独立的,并不是连续的波特率,而是检测到起始位了才开始产生波特率时钟,即每个字节都会进行波特率校正。所以不会有问题

应用的情景是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就会丢数据。

请问这样的理解是对的吗?
小梅哥
5楼-- · 2019-07-16 15:41
月亮下的蛋 发表于 2016-3-20 17:32
应用的情景是A连续发送。发完上一轮的停止位立刻发下一轮的起始位。起始位的检测是独立的。作为接收方B来说,检测每一位的时间t0(t0 = 1/9600)是固定的。假设t0是精确的。
所以B的一次完整接收周期是t0*(1+8+1)。假设A连续发送,如果B检测到有数据的时间滞后了t_delay时间,则每一轮检测都滞后t_delay。
这样不会有错。累 ...

说的有道理。所以uart协议中还存在1.5个停止位和2个停止位的模式
清水小和尚
6楼-- · 2019-07-16 16:41
 精彩回答 2  元偷偷看……

一周热门 更多>