OpenEdv-开源电子网

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

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

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-9-3 17:17:06 | 显示全部楼层 |阅读模式
10金钱
如题,我想要用串口把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.                 }
复制代码
思路如下:当串口接收到USART_RX_BUF[8]==0X07时,先将数组清零,设置一个标志位,执行while循环,发送PWM波驱动电机,此时跳出while有两个条件,一个是发送的PWM波超过5组,一个是串口接收到0X0A。第一种情况可以跳出while,第二种情况跳不出while,单独设置断点,串口接收是可以的,而且只有在while执行完之后,才可以读到串口的数据,百思不得其解。

最佳答案

查看完整内容[请看2#楼]

把这个放在中断里面 [*]if(USART_RX_BUF[8]==0X0A) [*] { [*] for(m=0;m
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2020-9-3 17:17:07 | 显示全部楼层
把这个放在中断里面
  • if(USART_RX_BUF[8]==0X0A)
  •         {
  •         for(m=0;m<9;m++)
  •                 {
  •                 USART_RX_BUF[m]=0;
  •                 }
  •         stop=1;//标志位
  •         TIM_Cmd(TIM1, DISABLE);
  •         }

回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2020-9-3 18:41:24 | 显示全部楼层
对,2楼正解。把stop设为 volatile属性。
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-9-4 08:45:46 | 显示全部楼层
liaohaijian 发表于 2020-9-3 18:01
把这个放在中断里面
  • if(USART_RX_BUF[8]==0X0A)
  •         {

  • 请问,放在中断里面是什么意思,放在while里面吗?
    回复

    使用道具 举报

    22

    主题

    2251

    帖子

    0

    精华

    论坛元老

    Rank: 8Rank: 8

    积分
    4480
    金钱
    4480
    注册时间
    2013-4-22
    在线时间
    337 小时
    发表于 2020-9-4 09:08:21 | 显示全部楼层
    while跳出可以用break;你的这种写法效率不高
    回复

    使用道具 举报

    48

    主题

    179

    帖子

    0

    精华

    初级会员

    Rank: 2

    积分
    185
    金钱
    185
    注册时间
    2017-6-19
    在线时间
    90 小时
     楼主| 发表于 2020-9-4 09:21:54 | 显示全部楼层
    三叶草 发表于 2020-9-4 09:08
    while跳出可以用break;你的这种写法效率不高

    我懂你的意思
    1. while(1)
    2.                         {
    3.                                 num_slow++;
    4.                                 TIM1_PWM_Init(600,71);               
    5.                                 TIM_SetCompare1(TIM1,300);                    
    6.                                 delay_ms(300);
    7.                                 TIM_Cmd(TIM1, DISABLE);
    8.                                 delay_ms(300);
    9.                         if(num_slow==5)                       
    10.                                 break;
    11.                         if(stop==1)
    12.                                 break;
    13.                         }
    复制代码

    请问您的意思是这样改为break跳出吗,我觉得这个和我上面的是一样的啊,可能是我经验不够,没发现这样写的缺点。我加一个标志位是为了方便在其它地方也可以用到,这样便于思路上的整理,个人能力有限,逻辑能力还有待加强~
    回复

    使用道具 举报

    48

    主题

    179

    帖子

    0

    精华

    初级会员

    Rank: 2

    积分
    185
    金钱
    185
    注册时间
    2017-6-19
    在线时间
    90 小时
     楼主| 发表于 2020-9-4 09:22:24 | 显示全部楼层
    liaohaijian 发表于 2020-9-3 18:01
    把这个放在中断里面
  • if(USART_RX_BUF[8]==0X0A)
  •         {

  • 你好,您的意思是把这句话放到while里面是吗?
    回复

    使用道具 举报

    9

    主题

    219

    帖子

    1

    精华

    金牌会员

    Rank: 6Rank: 6

    积分
    1434
    金钱
    1434
    注册时间
    2020-5-12
    在线时间
    394 小时
    发表于 2020-9-6 21:17:17 | 显示全部楼层
    王大爷爱吃鱼 发表于 2020-9-4 09:22
    你好,您的意思是把这句话放到while里面是吗?

    串口中断里面,加
    if(USART_RX_BUF[8]==0X0A)              
            {      
            for(m=0;m<9;m++)
                    {
                    USART_RX_BUF[m]=0;
                    }
            stop=1;//标志位
            TIM_Cmd(TIM1, DISABLE);                                                                          
            }
    if(USART_RX_BUF[8]==0X07)                        
                    {                  
                    for(m=0;m<9;m++)
                            {
                            USART_RX_BUF[m]=0;
                            }      
                    test_state_test=1;        //标志位      
    }
    主程序里面对标注位进行判断来看执行什么。
    回复

    使用道具 举报

    34

    主题

    255

    帖子

    0

    精华

    高级会员

    Rank: 4

    积分
    912
    金钱
    912
    注册时间
    2019-7-5
    在线时间
    189 小时
    发表于 2020-9-7 17:49:51 | 显示全部楼层
    王大爷爱吃鱼 发表于 2020-9-4 08:45
    请问,放在中断里面是什么意思,放在while里面吗?

    放在串口接收中断服务函数里面啊
    回复

    使用道具 举报

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

    本版积分规则



    关闭

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

    正点原子公众号

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

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

    Powered by OpenEdv-开源电子网

    © 2001-2030 OpenEdv-开源电子网

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