Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2805|回复: 0

06-单片机发送数据之中断发送

[复制链接]

56

主题

56

帖子

224

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
224
发表于 2020-9-21 09:38:55 | 显示全部楼层 |阅读模式




1. 前言
在单片机通信项目中,经常会使用串口发送数据
这节说一下普通发送和中断发送的区别.

2. 思考一下下面的程序
STM32非中断发送
819239-20200822204758945-1354827534.png

51单片机非中断发送
819239-20200822204826745-212252304.png


我现在要发送 100个数据
819239-20200822204850764-1119308980.png


3. 上面程序的问题
每次调用发送数据函数,就会停在那里,发送完成以后才会往下执行!
假设波特率是9600
那么就是 1/9600 S  也就是 0.1ms发送一位数据,发送一字节数据需要大约 0.9ms (8位数据,1个停止位)
如果发送100个数据,那么延时大约 90ms
如果有好几个地方都使用了上面的方式发送数据,程序的执行效率会大大降低!

4. 咱来解决上面的问题
1.STM32发送数据的时候咱用中断发送
819239-20200822204934637-451872812.png



819239-20200822204941321-1763817151.png


5.测试
819239-20200822204954506-866167742.png


819239-20200822205003575-1991391023.png



上面的程序只是使用中断发送数据.

我补充一下:
调用 UsartOutStrIT 函数只是把数据地址和数据长度进行了赋值
然后打开了发送中断

819239-20200822205029696-577037674.png



当前的程序并没有阻塞在那里,而是接着往下运行
只不过会一边执行发送中断一边在主循环运行.

6.提醒
1.在使用中断发送以后,需要小心一个地方!
假设是下面这样:
中断发送100字节;
非中断发送数据;

大家知道执行中断发送以后,发送数据交给了中断,程序继续往下执行
然后会接着执行  非中断发送数据;

现在就出问题了,中断发送着数据呢,然后调用了非中断发送
就会造成死机!

要么全部使用中断发送数据,要么等中断发送完,再调用非中断发送数据

2.
中断发送100字节;
中断发送100字节;
如果执行上面的程序也是有问题的!
第一个没有发送完,第二个便会覆盖第一个!

7.结语
这节只是抛砖引玉,更加完善的方案请用户接着阅读后面的章节.

给用户提供了51单片机和STM32中断发送数据的例子.

回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2020-10-31 18:56 , Processed in 0.082984 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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