【问题标题】:How to break the loop in an Arduino?如何打破 Arduino 中的循环?
【发布时间】:2018-06-13 16:54:01
【问题描述】:

我正在尝试在 Arduino 中编写一个简单的程序,LED 闪烁。

程序如下图。

#define red1 13
#define amber1 12
#define green1 11

void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);  
    pinMode(red1, OUTPUT);
    pinMode(amber1, OUTPUT);
    pinMode(green1, OUTPUT);
}

void Delay(int sec) {
    for(int i=0;i<sec;i++){
        if (Serial.available())
        {
            Button();
            break;
        }
        delay(1);
     }
}

void Light()
{
    digitalWrite(red1,HIGH);
    Delay(5000);
    digitalWrite(red1,LOW);
    digitalWrite(amber1,HIGH);
    Delay(5000);
    digitalWrite(amber1,LOW);
}

void Button()
{
    digitalWrite(red1,LOW);
    digitalWrite(amber1,LOW);      
    digitalWrite(green1,HIGH);
    delay(1000);
    digitalWrite(green1,LOW);
}

void loop() 
{
    Light();  
}

当我在串行监视器Button() 函数执行时输入一个值时,它应该在函数完成后立即结束,因为中断,但这个函数不断重复?我该如何解决这个问题,以便每当串行监视器中断时,Button() 会被执行一次,然后继续使用Light()

【问题讨论】:

  • 从串行接口读取字节,这样下次它就不再存在了。
  • 你的break和这里的if语句有关。所以它只是退出 if。
  • @BenjaminBarrois 是的,我使用 loop() 而不是 break 不起作用。
  • 我想你误解了我的意思。您的break 退出if 上下文而不是for 上下文(上下文是相应括号{...} 内的内容)。 HeheBoi给出的解决方案让你退出for上下文,这正是你想要的。
  • @BenjaminBarrois 这是错误的。 Break 会按照他的意愿打破 for 循环,问题不在于。

标签: c++ arduino break


【解决方案1】:

尝试替换

break;

return;

这将立即终止函数,因为您不会在循环之后执行其他语句。

您可以查看https://www.arduino.cc/reference/en/language/structure/control-structure/return/ 了解有关return 的更多信息

【讨论】:

  • 它仍然继续在绿色 LED 上,红色和琥珀色的闪烁强度较低 tinkercad.com/things/8Iq1hiD28UJ-brave-turing/…
  • @deepinside 你是什么意思?
  • @deepinside 顺便说一句,你应该按照 Mark Setchell 说的去做。
  • @HeheBoi 在这种情况下,breakreturn 在功能上完全相同。这不是问题。
  • 我按照你说的替换了,但是当我中断串行监视器时,绿色 LED 应该会闪烁一秒钟,但它会一直亮着并继续以较小强度的红色和黄色 LED 闪烁
【解决方案2】:

正如其他人简要提到的那样,由于您没有清除串行接口,您多次致电Button

现在发生的情况是调用Delay,假设接口上有可用信息,然后您按预期调用Buttonbreak,但是由于您没有通过读取可用信息来清除接口信息,您在下次致电Delay 时再次致电Button

要解决此问题,您需要在调用Button 之前在Button 函数或if 语句中从串行接口读取信息。

【讨论】:

  • 我无法从 Button 读取串行接口函数,因为我想在每次写入串行接口时调用该函数,如果我在 Light() 中调用,那么在 delay() 串行接口期间无法读取
  • @deepinside 你得解释清楚一点,我不知道你为什么不能从串行接口读取......
  • 当 delay() 函数执行时,Arduino 处于睡眠模式,所以如果我中断串行接口也不会读取它,所以我创建了单独的 Delay()
猜你喜欢
  • 2018-05-05
  • 1970-01-01
  • 2013-01-30
  • 2015-10-04
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
相关资源
最近更新 更多