Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino LED闪烁->需要一些澄清和解释_Arduino_Led - Fatal编程技术网

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

Arduino LED闪烁->需要一些澄清和解释,arduino,led,Arduino,Led,因此,我和我的朋友被分配了一项任务: 当“A”作为串行监视器的输入时,led必须闪烁一次。 当输入“B”时,led必须持续闪烁。 我们使用附带的代码成功地完成了任务 字符a; 无效设置 { pinMode13,输出; Serial.begin9600; } 空穴环 { ifSerial.available { a=串行读取; ifa=='A' { 数字写入13,高; delay1000;//等待1000毫秒 数字写入13,低; delay1000;//等待1000毫秒 } } ifa=='B'

因此,我和我的朋友被分配了一项任务: 当“A”作为串行监视器的输入时,led必须闪烁一次。 当输入“B”时,led必须持续闪烁。 我们使用附带的代码成功地完成了任务

字符a; 无效设置 { pinMode13,输出; Serial.begin9600; } 空穴环 { ifSerial.available { a=串行读取; ifa=='A' { 数字写入13,高; delay1000;//等待1000毫秒 数字写入13,低; delay1000;//等待1000毫秒 } } ifa=='B' { 数字写入13,高; 延迟500; 数字写入13,低; 延迟500; } } 但我们还有一个疑问需要澄清。 这两个条件都在环路内给出,但ifSerial.available条件内的条件使led闪烁一次,而ifSerial.available条件外的条件使led持续闪烁。为什么? 请注意,ifa=='A'和ifa=='B'的代码是相同的。 我真的需要对这个问题进行解释。

ifa==='B'将连续执行,因为它一直保持为真,直到收到新的输入,并且它在循环中被重复调用

ifa=='A'仅在接收到新字符后计算一次。如果没有字符,则不会再次检查该字符


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

在代码中,只有当Serial.available返回非零值时,才更改a所保留的字符,而非零值仅在您按键时发生。在中,我们可以看到Serial.available实际上返回可用字符数,因此建议使用Serial.available>0

如果我正确理解了您的问题,为了获得预期的行为,您应该将if“B”部分移动到if可用部分内。像这样的

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);
    }
  }
}

当您在串行监视器中输入某个内容并按enter键时,Serial.available返回true,然后读取缓冲区,在本例中为a或B,然后将变量a分配给读取的字符

您应该注意,Serial.available仅在按enter键时返回true,因此当您按enter键提交输入时,if条件下的代码将被执行,这就是led仅闪烁一次的原因,因为Serial.available之后返回false


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

Serial.available返回真值,无论是否按下enter键。串行端口上接收到的任何字符都会导致函数返回true。