感谢各位的解答,各位讲的都对我有所帮助 |
串口通讯到底有没有累积误差?对时钟精度到底有何要求?_串口误差容忍_liuxd3000的博客-CSDN博客 https://blog.csdn.net/liuxd3000/article/details/128396918 波特率误差,上面链接讲得很清楚了。下面的回答基于波特率为9600,1位停止位,无校验的情形。 第1个问题: 单串口收到一字节数据时,只要在小于10/baud(约1.04ms)时间取出,就不会影响下一字节接收。很多单片机有串口缓存,这时间等于10/baud*(缓存数量+1),例如新唐的m0有16字节收发缓存。只要在17.7mS内处理不会出错。 第2个问题: 只要收发波特率的偏差小于4.5%,就不会有问题。任意数量的数据通讯都不会有问题。 |
波特率误差 只要小于 2% 就可以忽略,不会影响传输。 起始位的作用,就是用来对齐的,所以,“误差累计” 是不存在的。 停止位,在实际通信的过程中,尤其是目标设备为单片机时,是可以不存在的,即大多时候,你发送完停止位之后,可以立刻发送起始位。 但是,在设备传输需求中又是普遍存在的,比如某设备要求2位停止位,代表他 每接受完一个字节数据后,必须有 两个位的间隔才能继续接收下一个字节。通常出现在性能比较差的 老设备中。 |
楼主明显对停止位理解有误,停止位只是插入一个固定的间隔时间,只是时间概念,并不存在实际的数据位。发送端要发送固定停止位时间,接收端并不检测停止位,只检测起始位。就算两端波特率有误差,累积到停止位就算完事儿,从起始位开始从零开始累积。 |
主要是和波特率有关。比如9600波特率,最短字节间距大约1mS有足够的时间存入缓存,并等待接收下一字节。具体起始停止位那是硬件的事 |
yzwzfyz 发表于 2023-8-23 11:30 非常非常感谢您的耐心回复。 请问帧和帧之间一般都存在停止位吗?即使是连续发送的数据。 我主要是不太理解第四步,即起始位修正误差的问题。如果帧和帧之间没有停止位的间隔,我不理解误差是如何消除的。如果主机发送的数据帧和帧之间无间隔(终止位紧接着起始位),又假设误差较大,那么RI置位有可能发生在第一个帧的终止位的后段,甚至第二个帧的起始位的前段,这样的话,单片机开始检测rxd跳变的时间不就在第二个帧的起始位中前段吗,第二个帧的起始位这一比特时间不就缩短了吗,如此一来,当发送的帧特别多,不就会出问题吗。 本人大一刚刚开始自学入门,暂时在家没有各种电子仪器实测信号,如果问题太过繁琐简单,还请多多谅解。 |
wulin 发表于 2023-8-23 07:59 非常非常感谢您的回复。 但是我还是不太理解起始位修正误差的说法,如果主机发送的数据帧和帧之间无间隔(终止位紧接着起始位),又假设误差较大,那么RI置位有可能发生在第一个帧的终止位的后段,甚至第二个帧的起始位的前段,这样的话,单片机开始检测rxd跳变的时间不就在第二个帧的起始位中前段吗,第二个帧的起始位这一比特时间不就缩短了吗,如此一来,当发送的帧特别多,不就会出问题吗。 本人大一刚刚开始入门,实验条件可能不足,暂时在家没有各种电子仪器实测信号,如果问题太过繁琐简单,还请多多谅解。 |
楼主的想法是对的,的确如此: 实际上:A向B串行通讯时,是允许波特率有误差的。 1、每帧,A会先发起始脉冲,而后再发数据。对方B会据此脉冲的边沿,进行同步,再依据自己波特率,每间隔一个周期,下载一位数据,由于两方存在周期误差(波特率误差),积累N位后,必然会发生错位现象。 2、如果双方波特率完全一致,这个N=∞,如果误差太大,N会很小。 3、好在还未发生错位时(下载的位数 < N),一帧就结束了,数据就不会出错。 4、下一帧会重新同步,积累的误差被清除重来。 硬件上通常采三取二。如你图中所示,当积累误达到30%宽度左右时(估计值),采样箭头会出界。 设A方=9600,B方=9640,误差约=1-9640/9000 = 0.416%,即每个脉冲会移位(误差前移或后移)0.4%。 当起始脉冲同步后,第几个脉冲采样会出界呢? 30% ÷ 0.416% = 72,在第72个脉冲之后,采样会出界而错。 一个字节通常有:需要 11至13个脉冲(起始+数据+校验+停止)。如此算来:即使5个字节不进行同步,也不会出错。 以上是估算,并不是楼主所要的直接答案。 不过楼主可以以12个脉冲为界,估算出当频率偏差多少时会出错。 不过要注意:以上参数要以手册上的数据为参考。这样才准确一些。 手册上会说明,当接到起始脉冲边沿后多久会进行数据采样(图中的三个采样脉冲),以及这三个采样脉冲的间隔。这样就计算得更准确一点了。 也有一次采样就认定的(以手册上说的为准)。 这些主要定义允许误差取多少?(极限是50%,保守取10%,上例取的是30%)。 |
硬件串口,只管中斷、接收。 |
UART是异步通信,无特殊情况下,一帧数据是10bit,传输时间只跟波特率相关。帧与帧之间的间隔时间不一定是相同的,会受到其它中断的影响。 |
接收到数据触发中断,32和51是这样,什么情况下中断要靠计算时间才能进入? |
你好。串行数据无论是发送或是接收过程中,每个位每个字节是有间隔的。波特率的定义就是----串行口每秒钟发送或是接收的二进制的位数,就叫这个串口的波特率。特别是在不定长数据传输过程中,两个字节的间隔超过一定值,就认为是这一组数据传输完毕! |
Kankanxi 发表于 2023-8-23 02:59 1.一帧数据至少包含起始位、数据位、结束位。连续接收一串数据,串口中断周期就是接收一帧数据的时间,中断函数运行时间必须小于或远小于中断周期。否则会丢失数据或不能及时处理数据。 2.异步通讯天然存在频率和相位误差,只要误差在可控范围就不会有问题。每一帧的起始位信号就相当于修正一次误差。不存在积累误差一说。 |
谢谢各位大佬的回复了![]() |
另外,如果晶振频率是11.0592MHz的话,虽然除尽了,但是误差是不是在持续积累呢?我想问这种误差积累到什么程度会出错误,另外,如何计算误差。 |
比如说晶振频率是12MHz |