Arduino (Serial.available()>;0)等待用户输入

Arduino (Serial.available()>;0)等待用户输入,arduino,arduino-c++,Arduino,Arduino C++,我在ArduinoIDE中面临用户输入问题。我希望arduino定期检查用户是否生成一些输入字符串(arduino每3秒检查一次),但即使3秒后没有输入(字符串顺序=”),arduino也会等待用户输入,当我键入一些内容时,它会退出“checkIncomingOrder”功能并再等待3秒。如蒙指教,我将不胜感激。我的简单代码如下: String order = ""; int timer; void setup() { Serial.begin(9600); timer = 0; }

我在ArduinoIDE中面临用户输入问题。我希望arduino定期检查用户是否生成一些输入字符串(arduino每3秒检查一次),但即使3秒后没有输入(字符串顺序=”),arduino也会等待用户输入,当我键入一些内容时,它会退出“checkIncomingOrder”功能并再等待3秒。如蒙指教,我将不胜感激。我的简单代码如下:

String order = "";
int timer;

void setup() {
  Serial.begin(9600);
  timer = 0;
}

void loop() {
  if (timer == 3)
  {
    checkIncomingOrder();
  }
  else
  {
    delay(1000);
    Serial.println("waiting");
    timer++;
  }
}

void checkIncomingOrder() {
  if (Serial.available() > 0) { 
    order = Serial.readStringUntil('\n'); 
  }
  if (order == "") {
    return;
  } else {
    Serial.println("Order is: " + order); 
    order = "";
    timer = 0;
  }
}

Serial::Available()
不阻塞。如果有可用字符,将调用
readStringUntil()
,但在换行可用之前不会返回,因此可能会发生输入阻塞

以下可能是更安全的非阻塞解决方案:

void checkIncomingOrder() 
{
    char ch = 0 ;
    while( ch != '\n' && Serial.available() > 0 ) 
    { 
        Serial.readBytes( &ch, 1 ) ; 
        order += ch ;
    }

    if( ch == '\n' ) 
    {
        Serial.println("Order is: " + order) ; 
        order = "" ;
        timer = 0 ;
    }
}
它允许您连续检查输入行,而不是每三秒检查一次,从而使解决方案更具响应性:

void loop() 
{
    checkIncomingOrder();
}

允许依次删除
计时器
变量。

如果有可用字符,将调用
readStringUntil()
,但在换行可用之前不会返回。