Моя функция Serial timout работает при первом вызове, но не при втором - PullRequest
0 голосов
/ 12 января 2020

Я хочу прочитать серийный номер и сделал функцию тайм-аута.

Я хочу прочитать письма или дату, но программа продолжится, если ничего не было отправлено.

Я уже работал по этой проблеме почти целый день, и можно было сузить ее до возможного решения. Но я не знаю, почему это работает.

Я вставил Serial.flu sh (), и теперь программа работает, как и ожидалось. Если это не введено, второй вызов «waitForSerial ...» не будет введен или немедленно завершен. Также и альтернативой, которая работает, являются две строки в while-l oop после гриппа sh.

. Я уже исключил, что это может быть проблемой: eclipse, программатор, плохое последовательное соединение .

ОБНОВЛЕНИЕ: Если печати до гриппа sh нет, то она также не работает. WTF?

ОБНОВЛЕНИЕ2: Я думаю, я знаю причину: я посылаю последовательные данные с "\ r \ n". Письмо позволяет моему timeOutfunction выйти и продолжить с кодом. С l oop и Serial.read () я хочу очистить буфер приема. При его очистке он пуст, но все еще заполнен входящим serial.data. Затем l oop завершается, но приемный буфер все еще заполнен. И когда код выполняется в "waitForSerialAndTimeOut (15000)", буфер приема был заполнен незамеченным, и поэтому функция позволяет нормальному выполнению кода, как это было бы допустимым вводом.

Новая функция emtpying буфера приемника:

void flushReceiveBuffer(){
    while(Serial.available()){
        Serial.read();
        delayMicroseconds(200); //wait for the buffer that may be filled simultaneously
    }
}
#include "arduino.h"


unsigned long serialStartTime;

bool waitForSerialAndTimeOut(unsigned long timeOut){
    serialStartTime = millis();
    while(!Serial.available()){
        if(millis() - serialStartTime > timeOut){
            Serial.println("Serial input timed out");
            return true;
        }
    }
    return false;
}

void checkForAndSetNewTime(){
    while(Serial.available()){
        Serial.read();
    }

    Serial.println(F("Send a letter to set date"));

    if(waitForSerialAndTimeOut(3000))
        return;

    Serial.println("continuing");
    Serial.flush(); //WHY is the second "waitForSerial..." not working WITHOUT this flush?

    while(Serial.available()){
//      Serial.print("Serial consumed: ");
//      Serial.println(Serial.read(),DEC);    //This works too instead of flush!!!

        Serial.read();
    }

    Serial.println(F("Set the current date with day month year hour minute day-of-the-week"));


    if(waitForSerialAndTimeOut(15000))
        return;

    Serial.println("parsing");

    int minute = 99;
    int hour, year, month, day;

    day   = Serial.parseInt(SKIP_ALL, 1);
    month = Serial.parseInt(SKIP_ALL, 1);
    year  = Serial.parseInt(SKIP_ALL, 1) - 2000;

    hour   = Serial.parseInt(SKIP_ALL, 1);
    minute = Serial.parseInt(SKIP_ALL, 1);


    Serial.print("read: ");
    Serial.print(day);
    Serial.print(".");
    Serial.print(month);
    Serial.print(".");
    Serial.print(year);
    Serial.print(" ");

    Serial.print(hour);
    Serial.print(":");
    Serial.print(minute);
    Serial.println();
}


void setup(){
    Serial.begin(57600);

    delay(300);

    Serial.println(__DATE__);
    Serial.println(__TIME__);


    checkForAndSetNewTime();


}

void loop(){

}


...