找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1196|回复: 16
打印 上一主题 下一主题
收起左侧

单片机初学者提问:请问串口中断函数的最长时间怎么算?

  [复制链接]
跳转到指定楼层
楼主
比如有一串数据传过来,字节和字节之前无时间间隔,我应该控制我的串口中断函数运行时间在多少以内才能使下一个数据能正常被接收,是1/baud吗。
另外还有个问题,如果晶振频率算出来的串口中断时间有浮点数误差,那么接收一个字节后,下一个字节的起始位不会相对变短产生误差吗?如果是的话怎么解决?
附图:

Snipaste_2023-08-23_01-52-06.png (10.57 KB, 下载次数: 20)

产生了漂移

产生了漂移
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1091773 发表于 2023-8-23 02:30 | 只看该作者
比如说晶振频率是12MHz
回复

使用道具 举报

板凳
ID:1091773 发表于 2023-8-23 02:59 | 只看该作者
另外,如果晶振频率是11.0592MHz的话,虽然除尽了,但是误差是不是在持续积累呢?我想问这种误差积累到什么程度会出错误,另外,如何计算误差。
回复

使用道具 举报

地板
ID:1091773 发表于 2023-8-23 03:00 | 只看该作者
谢谢各位大佬的回复了
回复

使用道具 举报

5#
ID:213173 发表于 2023-8-23 07:59 | 只看该作者
Kankanxi 发表于 2023-8-23 02:59
另外,如果晶振频率是11.0592MHz的话,虽然除尽了,但是误差是不是在持续积累呢?我想问这种误差积累到什么 ...

1.一帧数据至少包含起始位、数据位、结束位。连续接收一串数据,串口中断周期就是接收一帧数据的时间,中断函数运行时间必须小于或远小于中断周期。否则会丢失数据或不能及时处理数据。
2.异步通讯天然存在频率和相位误差,只要误差在可控范围就不会有问题。每一帧的起始位信号就相当于修正一次误差。不存在积累误差一说。
回复

使用道具 举报

6#
ID:16848 发表于 2023-8-23 08:14 | 只看该作者
你好。串行数据无论是发送或是接收过程中,每个位每个字节是有间隔的。波特率的定义就是----串行口每秒钟发送或是接收的二进制的位数,就叫这个串口的波特率。特别是在不定长数据传输过程中,两个字节的间隔超过一定值,就认为是这一组数据传输完毕!
回复

使用道具 举报

7#
ID:1061404 发表于 2023-8-23 08:19 | 只看该作者
接收到数据触发中断,32和51是这样,什么情况下中断要靠计算时间才能进入?
回复

使用道具 举报

8#
ID:752974 发表于 2023-8-23 08:37 | 只看该作者
UART是异步通信,无特殊情况下,一帧数据是10bit,传输时间只跟波特率相关。帧与帧之间的间隔时间不一定是相同的,会受到其它中断的影响。
回复

使用道具 举报

9#
ID:277550 发表于 2023-8-23 09:48 | 只看该作者
硬件串口,只管中斷、接收。
回复

使用道具 举报

10#
ID:123289 发表于 2023-8-23 11:30 | 只看该作者
楼主的想法是对的,的确如此:
实际上: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%)。
回复

使用道具 举报

11#
ID:1091773 发表于 2023-8-23 11:39 | 只看该作者
wulin 发表于 2023-8-23 07:59
1.一帧数据至少包含起始位、数据位、结束位。连续接收一串数据,串口中断周期就是接收一帧数据的时间,中 ...

非常非常感谢您的回复。
但是我还是不太理解起始位修正误差的说法,如果主机发送的数据帧和帧之间无间隔(终止位紧接着起始位),又假设误差较大,那么RI置位有可能发生在第一个帧的终止位的后段,甚至第二个帧的起始位的前段,这样的话,单片机开始检测rxd跳变的时间不就在第二个帧的起始位中前段吗,第二个帧的起始位这一比特时间不就缩短了吗,如此一来,当发送的帧特别多,不就会出问题吗。
本人大一刚刚开始入门,实验条件可能不足,暂时在家没有各种电子仪器实测信号,如果问题太过繁琐简单,还请多多谅解。
回复

使用道具 举报

12#
ID:1091773 发表于 2023-8-23 12:01 | 只看该作者
yzwzfyz 发表于 2023-8-23 11:30
楼主的想法是对的,的确如此:
实际上:A向B串行通讯时,是允许波特率有误差的。
1、每帧,A会先发起始脉 ...

非常非常感谢您的耐心回复。
请问帧和帧之间一般都存在停止位吗?即使是连续发送的数据。
我主要是不太理解第四步,即起始位修正误差的问题。如果帧和帧之间没有停止位的间隔,我不理解误差是如何消除的。如果主机发送的数据帧和帧之间无间隔(终止位紧接着起始位),又假设误差较大,那么RI置位有可能发生在第一个帧的终止位的后段,甚至第二个帧的起始位的前段,这样的话,单片机开始检测rxd跳变的时间不就在第二个帧的起始位中前段吗,第二个帧的起始位这一比特时间不就缩短了吗,如此一来,当发送的帧特别多,不就会出问题吗。
本人大一刚刚开始自学入门,暂时在家没有各种电子仪器实测信号,如果问题太过繁琐简单,还请多多谅解。
回复

使用道具 举报

13#
ID:884147 发表于 2023-8-23 12:25 | 只看该作者
主要是和波特率有关。比如9600波特率,最短字节间距大约1mS有足够的时间存入缓存,并等待接收下一字节。具体起始停止位那是硬件的事
回复

使用道具 举报

14#
ID:883242 发表于 2023-8-23 16:17 | 只看该作者
楼主明显对停止位理解有误,停止位只是插入一个固定的间隔时间,只是时间概念,并不存在实际的数据位。发送端要发送固定停止位时间,接收端并不检测停止位,只检测起始位。就算两端波特率有误差,累积到停止位就算完事儿,从起始位开始从零开始累积。
回复

使用道具 举报

15#
ID:624769 发表于 2023-8-23 17:11 | 只看该作者
波特率误差  只要小于 2%  就可以忽略,不会影响传输。

起始位的作用,就是用来对齐的,所以,“误差累计” 是不存在的。

停止位,在实际通信的过程中,尤其是目标设备为单片机时,是可以不存在的,即大多时候,你发送完停止位之后,可以立刻发送起始位。
但是,在设备传输需求中又是普遍存在的,比如某设备要求2位停止位,代表他 每接受完一个字节数据后,必须有 两个位的间隔才能继续接收下一个字节。通常出现在性能比较差的 老设备中。
回复

使用道具 举报

16#
ID:1073939 发表于 2023-8-23 17:26 | 只看该作者
串口通讯到底有没有累积误差?对时钟精度到底有何要求?_串口误差容忍_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%,就不会有问题。任意数量的数据通讯都不会有问题。
回复

使用道具 举报

17#
ID:1091773 发表于 2023-8-24 15:27 | 只看该作者
感谢各位的解答,各位讲的都对我有所帮助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表