找回密码
 立即注册

QQ登录

只需一步,快速开始

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

AVR单片机的串口通信被中断打乱的问题

[复制链接]
跳转到指定楼层
楼主
ID:28415 发表于 2021-6-4 09:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ATMEGA328P单片机在接收串口信号时,INT0外部中断发生。串口信号是否会被打乱,显示出乱码或完全接收不到串口信号了?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:342822 发表于 2021-6-4 10:49 | 只看该作者
补一下中断优先级
回复

使用道具 举报

板凳
ID:883031 发表于 2021-6-4 11:54 | 只看该作者
你看看外部中断和串口中断的优先级,51单片机的外部中断0的优先级最高,如果你没有把串口设为高优先级的话,肯定是会被打断的。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:28415 发表于 2021-6-4 13:50 | 只看该作者
很多朋友们都对我说要设定一下中断优先级,其实我的问题是:是否串口通信会被外部中断打乱,并不是如何让串口通信正常而忽略外部中断。
回复

使用道具 举报

5#
ID:28415 发表于 2021-6-4 13:51 | 只看该作者
其实我是想问当串口通讯和外部中断都存在时,串口通信是否会被外部中断打乱导致乱码。并不是设置优先级的问题。
回复

使用道具 举报

6#
ID:236035 发表于 2021-6-4 13:59 | 只看该作者
会不会被打乱,确实与优先级有关。所以那个中断更重要,就要提高哪个中断的优先级。
当外部中断优先级更高时,串口通信肯定会被打乱,导致乱码,甚至通讯失败。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:28415 发表于 2021-6-4 14:01 | 只看该作者
好的,感谢感谢
回复

使用道具 举报

8#
ID:383215 发表于 2021-6-4 21:58 | 只看该作者
AVR单片机有关中断优先级的指令,一条都没有,AVR单片机响应第一中断,就会自动关闭所有中断,需要响应第二中断,就要在进入第一中断打开第二中断的允许,需要响应第三中断,就要在进入第二中断打开第三中断的允许,越往后打开的中断,优先级越高,退出第一中断,又自动打开被允许的所有中断,AVR的这种中断处理方式比51单片机先进很多,51单片机也可以用这种方式处理中断,只是退出中断时要把关闭的中断打开,不必设置中断优先级。
接收串口信号时,INT0外部中断发生。串口信号是否会被打乱?这个要看具体情况,INT0外部中断从响应到退出的最大时间,不大于串口接收一个字节的时间,串口信号不会打乱,反之,肯定会打乱,只有在INT0外部中断里加一个串口接收中断的允许,相当于串口接收的优先级高于INT0外部中断,也就是串口接收中断可以嵌套于INT0外部中断,这个还必须保证串口接收中断不能影响INT0外部中断,否则还要另外想办法。最理想的编程方式是主程序和各个中断程序互不影响,最近我用两片ATMEGA8编串口程序,从机发给主机的主要数据只有三个字节,次要数据也是三个字节,我就用四个字节当数据头,加上六个数据,一共十个数据,就在INT0外部中断里发送,我的INT0外部中断是过零信号,也就是0.01秒响应一次,这个INT0外部中断不能被任何程序打断,否则过零触发可控硅就不准确了,那么我只要保证这个INT0外部中断程序的最大时间不大于0.01秒就可以了,用INT0外部中断计数,每十次发一个数据,那么我发送一个数据的时间不超过0.1秒,INT0外部中断和发送程序就互不干扰,连发送中断都不需要,主机每0.1秒接收一次数据,相当于有了一个每0.1秒进入一次接收数据的中断,就保证了两个单片机的时钟同步,主机发送给从机的数据仅有一个字节,就一秒钟发一次,只要从机的任何程序不超过一秒钟,接收就没有问题,从机肯定没有超过一秒的程序,随便找个空闲的地方,打开接收中断允许,进入接收中断收到数据后立即关闭接收中断。这样的结果是从机发给主机到接收到主机的信号,最大时间是两秒钟了,然而对我控制的电器没有影响,编任何单片机程序都应该把轻重缓急搞清楚,该快的地方快速处理,可以慢的地方慢慢处理,所有程序互不影响。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:28415 发表于 2021-6-4 22:20 | 只看该作者
kmsj 发表于 2021-6-4 21:58
AVR单片机有关中断优先级的指令,一条都没有,AVR单片机响应第一中断,就会自动关闭所有中断,需要响应第二 ...

感谢你的分享。
与你写的方法类似,我现在也是用2片单片机,第一片单片机用来接收外部中断,10个中断后发送一个串口指令给第2片单片机,并且连发,当第2片单片机接收到完整的一串指令后回复,只有第1个单片机得到回复指令后,才会停止发送。第2片单片机主要用来处理数据和接收完整的数据。
回复

使用道具 举报

10#
ID:383215 发表于 2021-6-5 22:15 | 只看该作者
mxlslf 发表于 2021-6-4 22:20
感谢你的分享。
与你写的方法类似,我现在也是用2片单片机,第一片单片机用来接收外部中断,10个中断后 ...

不用谢!那你只要把串口收发中断设置为高优先级,就不会被外部中断打乱,串口收发中断不影响外部中断,程序就不难编。无论是51还是AVR,我编的串口程序很少,这次编串口程序发现,按一定的时间一个数据一个数据的收发,比收发一串数据更简单,我传送的是温度和重量值,这些值是渐变,不是突变,我就可以慢慢传,我编程序喜欢慢中求稳。
回复

使用道具 举报

11#
ID:932412 发表于 2021-6-6 11:27 | 只看该作者
你先确保只有串口一个中断时,显示是否正常,如果正常,在排查其他方面吧。至少保证第一步接收不会时乱码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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