Arduino LED 闪烁 -> 需要一些澄清和解释

Arduino LED blinking -> need some clarification and explanation

所以,我和我的朋友被分配了一项任务: 当 'A' 作为串行监视器的输入时,LED 必须闪烁一次。 当输入 'B' 时,LED 必须连续闪烁。 我们使用附加的代码成功完成了任务。

char a;
void setup()
{
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  if(Serial.available())
  {
    a= Serial.read();
    if(a == 'A')
    {
      digitalWrite(13, HIGH);
      delay(1000); // Wait for 1000 millisecond(s)
      digitalWrite(13, LOW);
      delay(1000); // Wait for 1000 millisecond(s)
    }
  }

  if(a=='B')
  {
    digitalWrite(13,HIGH);
    delay(500);
    digitalWrite(13,LOW);
    delay(500);
  }
}

不过接下来我们有个疑惑有待澄清。 这两个条件都在循环内给出,但 if(Serial.available()) 条件内的条件使 LED 闪烁一次,而 if(Serial.available()) 外的条件使 LED 连续闪烁。为什么?? 请注意,if(a=='A')if(a=='B') 的代码相同。 这个问题我真的需要一个解释。

if(a=='B') 将连续执行,因为它在收到新输入之前一直保持为真,并且在 loop 中被重复调用。

if(a == 'A') 仅在收到新字符后计算一次。如果没有字符,则永远不会再次检查。

loop 被重复调用,无论是否有可用的新输入。变量 a 具有全局范围,因此它不会在调用之间更改。它将包含最后收到的输入。

在您的代码中,a 持有的字符仅在 Serial.available() returns 为 non-zero 值时才发生变化,这仅当你按下一个键时发生。在API Reference中,我们可以看到Serial.available()实际上是returns可用的字符数,所以推荐的用法是if (Serial.available() > 0).

要获得预期的行为(如果我正确理解了您的问题),您应该将 if 'B' 部分移动到 within if available() 部分。像这样

void loop()
{
  if (Serial.available() > 0)
  {
    a = Serial.read();
    if (a == 'A')
    {
      digitalWrite(13, HIGH);
      delay(1000); // Wait for 1000 millisecond(s)
      digitalWrite(13, LOW);
      delay(1000); // Wait for 1000 millisecond(s)
    }
    else if (a == 'B')
    {
      digitalWrite(13,HIGH);
      delay(500);
      digitalWrite(13,LOW);
      delay(500);
    }
  }
}

当你在串行监视器中输入一些东西并按下回车键时,然后 Serial.available() returns a true,然后你读取缓冲区,在这种情况下它是 AB,然后将变量 a 分配给读取的字符。

需要注意的是Serial.available() returns true只有在你回车的时候才会执行,所以当你回车提交输入的时候,if条件下的代码会被执行,并且这就是为什么 LED 只闪烁一次,因为在那之后 Serial.available() returns false.

由于在 Serial.available() 条件下您被分配了变量 c ,因此它仍然是串行监视器中读取的任何内容。这就是为什么当您输入 B 时,c == 'B' 始终为真并且 LED 持续闪烁。