Я хочу прочитать серийный номер и сделал функцию тайм-аута.
Я хочу прочитать письма или дату, но программа продолжится, если ничего не было отправлено.
Я уже работал по этой проблеме почти целый день, и можно было сузить ее до возможного решения. Но я не знаю, почему это работает.
Я вставил 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(){
}