(Serial.available ()> 0) ожидает ввода пользователя - PullRequest
0 голосов
/ 05 мая 2019

У меня проблема с пользовательским вводом в Arduino ide.Я хотел бы, чтобы arduino периодически проверял, генерирует ли пользователь какую-либо строку ввода (arduino проверяет ее каждые 3 секунды), но даже если нет ввода через 3 секунды (string order = ""), 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;
  }
}

1 Ответ

1 голос
/ 05 мая 2019

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

, что, в свою очередь, позволяетtimer переменная для удаления.

...