Как очистить входной последовательный буфер в Arduino?

Я общаюсь с модулем Wi-Fi esp8266 с помощью Arduino. Модуль возвращает запросы GET от других клиентов. Они будут иметь форму

GET /101011 HTTP/1.1\r\nHost...

Я хочу извлечь только 101011 из полученных последовательных данных и отбросить остальные. Я придумал этот небольшой фрагмент кода, чтобы проверить его, отправив данные с моего ноутбука.

Это код:

String s;

void setup() {

  Serial.begin(9600);
}

void loop() {

  if(Serial.available())
  {
    Serial.println("Inside");
    Serial.find("/");
    s = Serial.readStringUntil(' ');
    Serial.println(s);
    // Отбросьте остальные данные . Фрагмент из блога Джереми Блюма

    while(Serial.available()>0) Serial.read(); 

  }

}

Блог Джереми

Но когда я запускаю это с помощью ввода GET /101011 HTTP/1.1\r\n, вывод получается

Inside
101011
Inside
1.1\r\n

Почему Serial.available() возвращает значение true даже после прочтения всего? Как удалить остальные данные из буфера последовательного ввода?

, 👍-1

Обсуждение

Откуда вы знаете, что прочитали все? Последовательные данные все еще поступают с ESP8266, пока вы очищаете буфер, и вы очищаете его намного быстрее, чем поступают данные. Помните: серийные данные поступают *s...l...o...w...l...y...*, @Majenko

Прочтите это:~ https://hackingmajenkoblog.wordpress.com/2016/02/01/reading-serial-on-the-arduino/, @Majenko

@Majenko Спасибо тебе. Почитайте свой блог. Постараюсь воплотить это в своем дизайне., @Ray


1 ответ


2

Один из возможных подходов состоит в том, чтобы прочитать и отбросить все в течение определенного времени, например секунды. Например:

unsigned long now = millis ();
while (millis () - now < 1000)
  Serial.read ();  // считайте и отбрасывайте любые входные данные

Я не большой поклонник попыток "очистить входной буфер". Как вы узнаете, достаточно ли секунды? Или, может быть, это слишком долго? Вам лучше прочитать какой-нибудь известный разделитель.

,