当条件不满足时,在任何时候结束一个while循环

时间:2017-06-26 06:26:05

标签: c++ arduino arduino-ide

我正在编写一个程序,我需要运行一个可以随时中断的循环。在这种情况下,一系列音调反复播放,但当传感器中的一个值恢复为高电平时,应停止播放。

目前,我已经得到了这个:

void loop() {
while(digitalRead(ctsPin) == LOW) {
    // Some code here
  }
}

但是,while循环只会在其中的指令完成运行时中断。有没有办法让我可以反复运行这些,但是在任何时候停止它们,即使它是在中途通过?

提前致谢。

4 个答案:

答案 0 :(得分:2)

我认为你实际上是在询问如何立即打破一个循环,其中包含许多硬编码延迟(音调),无论当前正在执行的循环内的代码是什么。这是不可能的。

在整个循环中添加大量if语句无济于事,因为这不会阻止基于延迟的代码在完成之前播放当前音调。

另一种方法是创建某种包含要播放的项目的队列/环形缓冲区。播放音调的PWM中断将通过此队列并一次播放一个。

当您希望停止时,您只需禁用中断并将端口引脚拉至静音状态。这将导致它立即停止,即使程序正在播放音调信号的两个边缘之间的部分。

答案 1 :(得分:1)

break语句将中断当前循环。因此,您应该为要监视的条件设置条件语句,如果它的计算结果为true,则调用break

if (digitalRead(ctsPin) == HIGH){ break }

答案 2 :(得分:0)

问题不明确。要停止运行循环,可以使用下面给出的break。检查这是否是您正在寻找的。

   void loop() {
    while(digitalRead(ctsPin) == LOW) {
        // Some code here
        if (digitalRead(ctsPin) == HIGH){
            break;
        }
        // Some code here
      }
    }

答案 3 :(得分:0)

有两种方法可以立即打破""一种是使用中断,另一种是更频繁地检查条件 - 在每条指令之后如果真的有必要,然后突破:

void loop()
{
    while(digitalRead(ctsPin) == LOW)
    {
       // code block (or even a single statement)...
       if (digitalRead(ctsPin) == HIGH) break;
       // code block (or even a single statement)...
       if (digitalRead(ctsPin) == HIGH) break;
       // code block (or even a single statement)...
       if (digitalRead(ctsPin) == HIGH) break;
       // etc.
    }
}

如果你得到太多这些,那么建议改为查看中断。有关如何执行该操作以及目标板可用的各种中断的示例,我建议您查看Arduino Interrupt Documentation

如果您决定采用这种方式,请尝试一下,如果遇到问题,请提出其他问题,我们会帮助您。