OpenEdv-开源电子网

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

求解求解,请问怎么跳出while(1)函数

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-8-27 10:09:27 | 显示全部楼层 |阅读模式
10金钱
如题,我想要实现的功能是,串口接收到0x19的时候, LED0 LED1持续翻转,如果不加while(1),则只能翻转一次;我想要持续翻转,所以用的while(1);如题,如何退出while(1),代码如下,求解~
  1. if(USART_RX_BUF[8]!=0X19)
  2.         {
  3.                 while(1)
  4.                 {
  5.                 LED1=~LED1;
  6.                 LED0=~LED0;
  7.                 delay_ms(600);
  8.                 }
  9.         }
  10. else
  11.         {
  12.                 LED1=0;
  13.                 LED0=0;
  14.         }
复制代码


最佳答案

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

把里面的while(1)里的1 ,换成你要跳出来的条件就好了。比如,这样while(i
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2020-8-27 18:38:36 | 显示全部楼层
本帖最后由 弦子的弦 于 2020-8-28 01:11 编辑

C语言的关键字 break 可以跳出当前循环,此外 goto 也是可以的,但是不建议使用。此外还有 continue 这些关键词楼主可以了解一下。
比如以下程序只会被运行一次:
  1. while(1)
  2. {
  3.     printf("hello World\r\n");
  4.     break;
  5. }
复制代码
当然这种写法没有意义,一般你可以加入条件,判断何时break出循环:
  1. //假设PA2 接按钮,按下低电平
  2. u8 button_pressed(void)
  3. {
  4.     return gpio_read_PA2();
  5. }

  6. while(1)
  7. {
  8.     printf("Looping\r\n");
  9.     if(!button_pressed())       //如果 取反为1 则说明原值为0 即使被按下了
  10.    {
  11.        break;                       //跳出while循环
  12.    }
  13. }
复制代码
这样你就可以给PA2这个IO口输入低电平,来让程序跳出循环了。

但是循环或退出只和一个条件有关联的while语句块,通常被简化成,:
  1. while(button_pressed())          //如果没按下,则一直是1 所以一直循环,按下为0,while跳出循环
  2. {
  3.     printf("Looping\r\n");
  4. }
复制代码



回复

使用道具 举报

4

主题

211

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2600
金钱
2600
注册时间
2016-7-6
在线时间
546 小时
发表于 2020-8-27 10:09:28 | 显示全部楼层
把里面的while(1)里的1 ,换成你要跳出来的条件就好了。比如,这样while(i <= 10000),你想出来的时候,就将 i 的值设置得比10000大就好了。
把复杂的事,做简单!
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1434
金钱
1434
注册时间
2020-5-12
在线时间
394 小时
发表于 2020-8-27 13:09:00 | 显示全部楼层
uint8_t flag = 0;
while(1)
{
if(USART_RX_BUF[8]!=0X19)
{
flag  = 1;
}
else
{
flag= 0;
}

if(flag == 1)
{
                LED1=~LED1;
                LED0=~LED0;
                delay_ms(600);
}
else
{
                LED1=0;
                LED0=0;
}
}
回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2019-7-3
在线时间
29 小时
发表于 2020-8-27 15:40:07 | 显示全部楼层
设置一个标志位,把while换成if
回复

使用道具 举报

0

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2016-6-23
在线时间
66 小时
发表于 2020-8-27 15:54:34 | 显示全部楼层
把if换成while, 将while(1)删除
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2020-8-27 20:04:54 | 显示全部楼层
6楼正解。
LZ需要补一下C语言基础。
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-8-31 16:11:48 | 显示全部楼层
弦子的弦 发表于 2020-8-27 18:38
C语言的关键字 break 可以跳出当前循环,此外 goto 也是可以的,但是不建议使用。此外还有 continue 这些关 ...

谢谢~~~~~
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-8-31 16:12:27 | 显示全部楼层
brucewoo 发表于 2020-8-27 20:04
6楼正解。
LZ需要补一下C语言基础。

确实C语言基础有点儿薄弱,需要补充一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 18:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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