在未满足条件时的任何时刻结束一个段循环

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

本文关键字:段循环 循环 一个 结束 条件 未满足 时刻 任何      更新时间:2023-10-16

我目前正在编写一个程序,我需要在任何时候都可以在其中打断一个循环。在这种情况下,一系列的音调一遍又一遍地播放,但是当传感器中的一个值之一恢复时,应该停止。

目前,我已经知道了:

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

但是,只有在其内部指令完成运行时,while循环才会断开。有没有一种方法可以一遍又一遍地运行这些方法,但即使它是部分的?

预先感谢。

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

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

替代方案是创建包含要播放的项目的队列/环缓冲区。播放音调的PWM中断将通过此队列并一次播放它们。

当您想停止时,您将简单地禁用中断,然后将端口引脚拉到无声状态。即使程序在音调信号的两个边缘之间扮演角色,这也会立即停止。

break语句将中断当前循环。因此,您应该有一个有条件的声明,以便您要监视的条件,如果评估为true,请致电break

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

问题不清楚。要停止运行循环,您可以使用以下给出的休息时间。检查这是否是您要寻找的。

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

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

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中断文档。

如果您决定这样做,请尝试一下,然后如果您遇到问题,请提出其他问题,我们会为您提供帮助。