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
,然后你读取缓冲区,在这种情况下它是 A
或 B
,然后将变量 a
分配给读取的字符。
需要注意的是Serial.available()
returns true
只有在你回车的时候才会执行,所以当你回车提交输入的时候,if条件下的代码会被执行,并且这就是为什么 LED 只闪烁一次,因为在那之后 Serial.available()
returns false
.
由于在 Serial.available()
条件下您被分配了变量 c
,因此它仍然是串行监视器中读取的任何内容。这就是为什么当您输入 B
时,c == 'B'
始终为真并且 LED 持续闪烁。
所以,我和我的朋友被分配了一项任务: 当 '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
,然后你读取缓冲区,在这种情况下它是 A
或 B
,然后将变量 a
分配给读取的字符。
需要注意的是Serial.available()
returns true
只有在你回车的时候才会执行,所以当你回车提交输入的时候,if条件下的代码会被执行,并且这就是为什么 LED 只闪烁一次,因为在那之后 Serial.available()
returns false
.
由于在 Serial.available()
条件下您被分配了变量 c
,因此它仍然是串行监视器中读取的任何内容。这就是为什么当您输入 B
时,c == 'B'
始终为真并且 LED 持续闪烁。