OpenEdv-开源电子网

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

STM32串口中断导致死机的问题

[复制链接]

8

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2020-11-16
在线时间
19 小时
发表于 2021-12-8 11:10:20 | 显示全部楼层 |阅读模式
下位机通过串口一直给STM32f103c8t6上位机发送数据,然后上位机进行计算,最近发现一个问题:
1. 我每次都得先开下位机让数据开始发送,然后再给上位机供电,这样才能正常运行;
2. 比如测试过程中,突然吧下位机断电,导致上位机接收不到数据,上位机直接就死机了(stm32直接不工作了),重启后问题解决。
这是怎么回事呢?单片机的串口接收是用中断接收数据的,下面是中断接收数据的代码:
  1.   if(LL_USART_IsActiveFlag_RXNE(USART2)) //判断USART2是否接收到数据
  2.         {

  3.                 Rx_buff[RxCounter++]=LL_USART_ReceiveData8(USART2);

  4.                 if(Rx_buff[0]==0x24&&Rx_buff[13]==0xFF&&RxCounter==14)
  5.                 {        
  6.                         Rxflag=1;
  7.                         RxCounter=0;                        
  8.                 }
  9.                 if (RxCounter==14)        
  10.                     RxCounter=0;        
  11.             LL_USART_ClearFlag_ORE(USART2); //清除ORE
  12.         }
复制代码
在主函数里面直接开启中断:
  1. LL_USART_EnableIT_PE(USART2);  //开启串口总中断
  2. LL_USART_EnableIT_RXNE(USART2);  //开启串口2接收中断
  3. LL_USART_EnableIT_ERROR(USART2); //开启串口2错误中断
复制代码
在while(1)里面不停的检测数据标志位,对每一帧数据进行计算处理

这个是哪里的问题呢?停止接收数据后为啥直接就死机了呢?

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

使用道具 举报

0

主题

668

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
金钱
1926
注册时间
2021-8-13
在线时间
262 小时
发表于 2021-12-8 15:35:39 | 显示全部楼层
回复 支持 反对

使用道具 举报

12

主题

3399

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8677
金钱
8677
注册时间
2020-5-11
在线时间
4153 小时
发表于 2021-12-8 15:55:19 | 显示全部楼层
假如RxCounter初值为15会如何
专治疑难杂症
回复 支持 反对

使用道具 举报

8

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2020-11-16
在线时间
19 小时
 楼主| 发表于 2021-12-8 18:01:29 来自手机 | 显示全部楼层
LcwSwust 发表于 2021-12-8 15:55
假如RxCounter初值为15会如何

我觉着不影响,15的话最后一个数据就一直没有
回复 支持 反对

使用道具 举报

8

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2020-11-16
在线时间
19 小时
 楼主| 发表于 2021-12-8 18:02:07 来自手机 | 显示全部楼层
Tlava 发表于 2021-12-8 15:35
帮顶

顶一哈,找不到问题啦
回复 支持 反对

使用道具 举报

12

主题

3399

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8677
金钱
8677
注册时间
2020-5-11
在线时间
4153 小时
发表于 2021-12-9 09:09:22 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-12-9 09:10 编辑
FlashGQ 发表于 2021-12-8 18:01
我觉着不影响,15的话最后一个数据就一直没有

举个例子:char rx_buff[14];char buff2[10];char buff3[10];
若RxCounter初值为15或其它大于14的值,那么 if (RxCounter==14) 就不会成立;
Rx_buff[RxCounter++]=...会让RxCounter一直加下去,就会将数据写入buff2甚至buff3,甚至不知道写到了哪里引起死机,
这就是“数组越界”
专治疑难杂症
回复 支持 反对

使用道具 举报

1

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
370
金钱
370
注册时间
2020-1-19
在线时间
51 小时
发表于 2021-12-9 09:20:38 | 显示全部楼层
单片机的程序不会像电脑的那么“安份守纪”,最好像楼上讲的把那个判断改成RxCounter>=14再试试看
回复 支持 反对

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2020-3-15
在线时间
28 小时
发表于 2021-12-9 09:40:39 | 显示全部楼层
debug看看
回复 支持 反对

使用道具 举报

8

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2020-11-16
在线时间
19 小时
 楼主| 发表于 2021-12-10 13:23:01 来自手机 | 显示全部楼层
LcwSwust 发表于 2021-12-9 09:09
举个例子:char rx_buff[14];char buff2[10];char buff3[10];
若RxCounter初值为15或其它大于14的值, ...

嗯呢您说的这个确实是问题,每次重新供电的时候这个值是0,但是断开了可能会越界
回复 支持 反对

使用道具 举报

8

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2020-11-16
在线时间
19 小时
 楼主| 发表于 2021-12-10 13:23:23 来自手机 | 显示全部楼层
lanneret 发表于 2021-12-9 09:20
单片机的程序不会像电脑的那么“安份守纪”,最好像楼上讲的把那个判断改成RxCounter>=14再试试看

我调试一哈看看中不中
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 16:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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