我正在编写一个程序,我需要运行一个可以随时中断的循环。在这种情况下,一系列音调反复播放,但当传感器中的一个值恢复为高电平时,应停止播放。
目前,我已经得到了这个:
void loop() {
while(digitalRead(ctsPin) == LOW) {
// Some code here
}
}
但是,while循环只会在其中的指令完成运行时中断。有没有办法让我可以反复运行这些,但是在任何时候停止它们,即使它是在中途通过?
提前致谢。
答案 0 :(得分:2)
我认为你实际上是在询问如何立即打破一个循环,其中包含许多硬编码延迟(音调),无论当前正在执行的循环内的代码是什么。这是不可能的。
在整个循环中添加大量if语句无济于事,因为这不会阻止基于延迟的代码在完成之前播放当前音调。
另一种方法是创建某种包含要播放的项目的队列/环形缓冲区。播放音调的PWM中断将通过此队列并一次播放一个。
当您希望停止时,您只需禁用中断并将端口引脚拉至静音状态。这将导致它立即停止,即使程序正在播放音调信号的两个边缘之间的部分。
答案 1 :(得分:1)
break
语句将中断当前循环。因此,您应该为要监视的条件设置条件语句,如果它的计算结果为true,则调用break
。
if (digitalRead(ctsPin) == HIGH){
break
}
答案 2 :(得分:0)
问题不明确。要停止运行循环,可以使用下面给出的break。检查这是否是您正在寻找的。 p>
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。
如果您决定采用这种方式,请尝试一下,如果遇到问题,请提出其他问题,我们会帮助您。