OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4878|回复: 14

定时器里面串口发送函数while()等待发送完成,进入死循环

[复制链接]

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
发表于 2021-1-14 10:58:02 | 显示全部楼层 |阅读模式
定时器函数:
lALPBGKobqxR0VXNAZjNBEQ_1092_408.png
串口发送多字节函数,使用while()等待发送完成
lALPBGY17VEaVaXNAdbNA5o_922_470.png


结果是发送失败,卡死在while()处。如果把串口发送函数放到main()函数执行,可以正常发送。
是中断混乱了还是其他原因?
如果不使用while()等待发送完成,那有什么办法判断发送完成?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3399

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8677
金钱
8677
注册时间
2020-5-11
在线时间
4153 小时
发表于 2021-1-14 11:31:29 | 显示全部楼层
按理来说,等待TXE标志与是否进入串口中断函数无关,不应该会卡死。
但一般来说也不应在中断里占用太多时间,像串口若是9600的波特率用查询式发送就可能每个字节等待1ms,这样不好。
建议在中断里需发数据时置个标志,主循环读到此标志则发送数据。
另外,也可以使用循环队列来提高效率。
专治疑难杂症
回复 支持 1 反对 0

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-1-14 11:04:17 | 显示全部楼层
考虑不能抢占原因,但设置定时器中断优先级是1,2  串口中断优先级是0,1 还是不行
回复 支持 反对

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2020-5-11
在线时间
253 小时
发表于 2021-1-14 11:33:18 | 显示全部楼层
请把串口相关东西从定时器中断函数中剔除出去。   正确做法:中断函数释放标志位,外部捕捉标志位然后进行串口收发
回复 支持 反对

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3627
金钱
3627
注册时间
2019-8-14
在线时间
1054 小时
发表于 2021-1-14 12:15:37 | 显示全部楼层
中断应该快进快出,不要执行过多的任务,尤其是循环
回复 支持 反对

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-1-14 14:03:57 | 显示全部楼层
LcwSwust 发表于 2021-1-14 11:31
按理来说,等待TXE标志与是否进入串口中断函数无关,不应该会卡死。
但一般来说也不应在中断里占用太多时 ...

是的,之前别的程序都可以,就是我这工程被我玩坏了。
(1)之前在定时中断函数里使用printf(),使中断错乱了;
(2)之前错误使用了extern声明函数,导致链接错乱了
改回来也不行了,估计要重新建工程才行了
回复 支持 反对

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-1-14 14:10:18 | 显示全部楼层
LcwSwust 发表于 2021-1-14 11:31
按理来说,等待TXE标志与是否进入串口中断函数无关,不应该会卡死。
但一般来说也不应在中断里占用太多时 ...

看来的确非常影响效率。 金牌会员
回复 支持 反对

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-1-14 14:57:53 | 显示全部楼层
LcwSwust 发表于 2021-1-14 11:31
按理来说,等待TXE标志与是否进入串口中断函数无关,不应该会卡死。
但一般来说也不应在中断里占用太多时 ...

那串口中断接收函数也一样非常耗时
回复 支持 反对

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-1-14 14:59:45 | 显示全部楼层
LcwSwust 发表于 2021-1-14 11:31
按理来说,等待TXE标志与是否进入串口中断函数无关,不应该会卡死。
但一般来说也不应在中断里占用太多时 ...

如果多个定时器,考虑到优先级和时效性,还得放在中断函数里。但串口等特别耗时的可以提取出去
回复 支持 反对

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-1-14 15:24:23 | 显示全部楼层
lALPBE1XdtMhKfDNAgPNBZ4_1438_515.png 进入死循环
回复 支持 反对

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-1-14 16:13:24 | 显示全部楼层
thisisdemo 发表于 2021-1-14 11:33
请把串口相关东西从定时器中断函数中剔除出去。   正确做法:中断函数释放标志位,外部捕捉标志位然后进行 ...

我就奇怪为什么主循环可以,放进定时器里面就卡死了
回复 支持 反对

使用道具 举报

12

主题

3399

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8677
金钱
8677
注册时间
2020-5-11
在线时间
4153 小时
发表于 2021-1-14 19:03:49 | 显示全部楼层
跟紧我 发表于 2021-1-14 14:57
那串口中断接收函数也一样非常耗时

中断接收不会非常耗时,因为接收完一个字节才会产生中断,并可立即读取.
接收一字节从开始位到结束位过程中并不占用CPU(或可把串口模块当作另一个CPU).
专治疑难杂症
回复 支持 反对

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-1-15 09:57:45 | 显示全部楼层
LcwSwust 发表于 2021-1-14 19:03
中断接收不会非常耗时,因为接收完一个字节才会产生中断,并可立即读取.
接收一字节从开始位到结束位过程 ...

这样看中断接收的确不怎么耗时。
但是我这串口发送为什么主循环可以,放进定时器里面就卡死了?能帮分析一下吗
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2016-1-28
在线时间
40 小时
发表于 2021-1-15 10:12:34 | 显示全部楼层
是不是该把  USART_SendData(  );  放在 while( );  语句前面;
又或者把 while( );  后面的分号去掉试试。
回复 支持 反对

使用道具 举报

12

主题

3399

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8677
金钱
8677
注册时间
2020-5-11
在线时间
4153 小时
发表于 2021-1-15 10:40:09 | 显示全部楼层
跟紧我 发表于 2021-1-15 09:57
这样看中断接收的确不怎么耗时。
但是我这串口发送为什么主循环可以,放进定时器里面就卡死了?能帮分析 ...

去掉无关代码后把完整工程发上来看看
专治疑难杂症
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 18:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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