在不满足条件的任何时候结束 while 循环

Ending a while loop at any point when condition is not met

我目前正在编写一个程序,我需要 运行 一个可以随时中断的循环。在这种情况下,一系列音调一遍又一遍地播放,但当来自传感器的其中一个值返回为高电平时应该停止。

目前,我得到了这个:

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

但是,while 循环只有在其中的指令完成 运行ning 时才会中断。有没有一种方法可以让我一遍又一遍地 运行 这些但随时停止它们,即使它是中途的?

提前致谢。

break语句会中断当前循环。所以你应该为你正在监视的条件有一个条件语句,如果它的计算结果为真,调用 break.

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

问题不明确。要停止 运行 循环,您可以使用 break,如下所示。检查这是否是您要查找的内容。

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

有两种中断方式"instantly."一种是使用中断,另一种是更频繁地检查条件——如果确实需要,在每条指令之后,然后中断:

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.

如果您决定这样做,请尝试一下,如果您 运行 遇到问题,请提出不同的问题,我们会帮助您。

我认为您实际上是在问如何立即中断其中有许多硬编码延迟(音调)的循环,无论该循环中当前正在执行什么代码。那是不可能的。

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

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

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