野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 25218|回复: 12

while()语句怎么才能被串口打断

[复制链接]
发表于 2020-9-3 17:39:50 | 显示全部楼层 |阅读模式
10火花
如题,我想要用串口把while语句给打断,却发现执行while语句的时候,串口接收不到数据,只有等while执行完之后才能读到串口的数据,是我的思路有问题吗,代码如下,求解~
思路如下:当串口接收到USART_RX_BUF[8]==0X07时,先将数组清零,设置一个标志位,执行while循环,发送PWM波驱动电机,此时跳出while有两个条件,一个是发送的PWM波超过5组,一个是串口接收到0X0A。第一种情况可以跳出while,第二种情况跳不出while,单独设置断点,串口接收是可以的,而且只有在while执行完之后,才可以读到串口的数据,百思不得其解。
  1. if(USART_RX_BUF[8]==0X0A)              
  2.         {        
  3.         for(m=0;m<9;m++)
  4.                 {
  5.                 USART_RX_BUF[m]=0;
  6.                 }
  7.         stop=1;//标志位
  8.         TIM_Cmd(TIM1, DISABLE);                                                                           
  9.         }
  10.                         

  11. if(USART_RX_BUF[8]==0X07)                        
  12.                 {                  
  13.                 for(m=0;m<9;m++)
  14.                         {
  15.                         USART_RX_BUF[m]=0;
  16.                         }        
  17.                 test_state_test=1;        //标志位               
  18.                         while(test_state_test==1)
  19.                         {
  20.                                 num_slow++;
  21.                                 TIM1_PWM_Init(600,71);               
  22.                                 TIM_SetCompare1(TIM1,300);                    
  23.                                 delay_ms(300);
  24.                                 TIM_Cmd(TIM1, DISABLE);
  25.                                 delay_ms(300);
  26.                         if(num_slow==5)                       
  27.                                 test_state_test=0;
  28.                         if(stop==1)
  29.                                 test_state_test=0;
  30.                         }        
  31.                 TIM_Cmd(TIM1, DISABLE);
  32.                 }
复制代码


回复

使用道具 举报

发表于 2020-9-4 08:57:41 | 显示全部楼层
串口用中断接收,调高中断优先级。
TIM1_PWM_Init的参数如果是固定的话,我感觉不需要放在while里面
回复

使用道具 举报

 楼主| 发表于 2020-9-4 09:02:46 | 显示全部楼层
瞎眼灯 发表于 2020-9-4 08:57
串口用中断接收,调高中断优先级。
TIM1_PWM_Init的参数如果是固定的话,我感觉不需要放在while里面 ...

1.串口的优先级已经是最高了
2.TIM1_PWM_Init之所以放在while是因为我想要实现多发几组脉冲的效果(转停,转停……转停),如果不用while的话,发一组脉冲就停了,效果为(转停);而如果不加延时的话,效果就是一直转,中间没有停顿的效果
回复

使用道具 举报

发表于 2020-9-4 09:26:58 | 显示全部楼层
你一直在while里面循环了,就是有收到0x0A,只有发完5组脉冲之后才能执行到判断0x0A那里。如果你想0x0A跳出while,应该吧0x0A判断放在while循环里面一直判断
回复

使用道具 举报

发表于 2020-9-4 09:28:00 | 显示全部楼层
如果串口不进中断的话,就是你串口的中断写的有问题。
建议扎实学一下基础知识,别还没 学会走路就想着飞,
回复

使用道具 举报

 楼主| 发表于 2020-9-4 09:40:06 | 显示全部楼层
还有梦与你 发表于 2020-9-4 09:26
你一直在while里面循环了,就是有收到0x0A,只有发完5组脉冲之后才能执行到判断0x0A那里。如果你想0x0A跳出 ...

我按照你的思路改了,把串口接收到0X0A放到了while里面,一样在5组脉冲发送完成之前,是接收不到0X0A的,我用断点仿真和实际测得现象都是一致的,问题还没找到

  1. if(USART_RX_BUF[8]==0X07)                        
  2.                 {                  
  3.                 for(m=0;m<9;m++)
  4.                         {
  5.                         USART_RX_BUF[m]=0;
  6.                         }        
  7.                 test_state_test=1;        //标志位               
  8.                         while(test_state_test==1)
  9.                         {
  10.                                 num_slow++;
  11.                                 TIM1_PWM_Init(600,71);               
  12.                                 TIM_SetCompare1(TIM1,300);                    
  13.                                 delay_ms(300);
  14.                                 TIM_Cmd(TIM1, DISABLE);
  15.                                 delay_ms(300);

  16.                         if(num_slow==5)                       
  17.                                 test_state_test=0;
  18.                         if(USART_RX_BUF[8]==0X0A)              
  19.                                                   {   
  20.                                                                 test_state_test=0;
  21.                                                                 TIM_Cmd(TIM1,DISABLE);                                                               
  22.                                                 for(m=0;m<9;m++)
  23.                                                         {
  24.                                                         USART_RX_BUF[m]=0;                                                        }                                                       
  25.                                                   }
  26.                         }        
  27.                 TIM_Cmd(TIM1, DISABLE);
  28.                 }
复制代码
回复

使用道具 举报

 楼主| 发表于 2020-9-4 09:44:28 | 显示全部楼层
H781997429 发表于 2020-9-4 09:28
如果串口不进中断的话,就是你串口的中断写的有问题。
建议扎实学一下基础知识,别还没 学会走路就想着飞, ...

可是我单独仿真串口的时候,是接收到串口的数据了,说明我的串口中断是没问题的。只不过在while运行的时候接受不到串口的数据。简言之,必须要等while跑完,才能接受串口数据。串口优先级我已经调到最高了,难道while优先级比所有中断优先级都要高吗,还是说机制就是必须要等while跑完才能进入中断?
回复

使用道具 举报

发表于 2020-9-4 10:18:28 | 显示全部楼层
将心明月 发表于 2020-9-4 09:40
我按照你的思路改了,把串口接收到0X0A放到了while里面,一样在5组脉冲发送完成之前,是接收不到0X0A的, ...

这段程序你不会放在串口中断里面的吧?
回复

使用道具 举报

 楼主| 发表于 2020-9-4 11:34:13 | 显示全部楼层
还有梦与你 发表于 2020-9-4 10:18
这段程序你不会放在串口中断里面的吧?

放在中断服务函数里面的
回复

使用道具 举报

发表于 2020-9-4 14:27:42 | 显示全部楼层
将心明月 发表于 2020-9-4 11:34
放在中断服务函数里面的

一直在串口中断里面怎么还能接收得到数据,你得放在空闲的地方
回复

使用道具 举报

 楼主| 发表于 2020-9-5 11:09:57 | 显示全部楼层
还有梦与你 发表于 2020-9-4 14:27
一直在串口中断里面怎么还能接收得到数据,你得放在空闲的地方

可是我放在中断服务函数里面,只要不是while里面就可以接收到串口的数据啊
回复

使用道具 举报

发表于 2020-9-5 15:05:52 | 显示全部楼层
将心明月 发表于 2020-9-4 09:40
我按照你的思路改了,把串口接收到0X0A放到了while里面,一样在5组脉冲发送完成之前,是接收不到0X0A的, ...

这段代码是不是放在串口接收中断里的?如果是的话,我觉得可能是中断函数执行的时间太长了。中断函数里是不能有延时的喔,中断里的内容需要尽可能快的执行完毕。
回复

使用道具 举报

发表于 2020-9-7 08:53:24 | 显示全部楼层
将心明月 发表于 2020-9-5 11:09
可是我放在中断服务函数里面,只要不是while里面就可以接收到串口的数据啊
...

没进入while的情况,下一个字节数据进来已经出去了,没有占用中断服务肯定可以接受。关键是如果进入while里面,接收第一个字节就在while里面浪费了(300+300)*5=3000ms,就是3秒,3秒的时间几百个字节都发完了。所以不要再纠结这些,你就把while放在空闲地方就行了
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 09:27 , Processed in 0.044483 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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