Arduino 我的串行timout函数在第一次调用时有效,但在第二次调用时无效
我想读te串行,并已做了一个超时功能 我想阅读信件或日期,但如果没有发送任何内容,则让程序继续 我几乎一整天都在研究这个问题,可以把它缩小到一个可能的解决方案。但我不知道为什么这是工作 我输入了一个“Serial.flush()”,现在程序按预期工作。如果未输入,则不会输入或立即退出对“waitForSerial…”的第二次调用。 另一个可行的替代方案是冲洗后while循环中的两行 我已经排除了这可能是一个问题:eclipse,程序员,坏的串行连接 更新: 如果flush之前的println不存在,那么它也不起作用。WTF 更新2: 我想我知道原因: 我发送带有“\r\n”的串行数据。这封信让我的timeOutfunction退出并继续执行代码。对于循环和Serial.read(),我想清空接收缓冲区。当清空它时,它是空的,但仍然充满了传入的serial.data。然后退出循环,但接收缓冲区仍在填充。当代码在“waitForSerialAndTimeOut(15000)”执行时,receivebuffer会在未被注意的情况下被填充,因此函数会让代码正常运行,因为会有有效的输入 新的receiverbuffer emtpying功能:Arduino 我的串行timout函数在第一次调用时有效,但在第二次调用时无效,arduino,serial-port,atmega,Arduino,Serial Port,Atmega,我想读te串行,并已做了一个超时功能 我想阅读信件或日期,但如果没有发送任何内容,则让程序继续 我几乎一整天都在研究这个问题,可以把它缩小到一个可能的解决方案。但我不知道为什么这是工作 我输入了一个“Serial.flush()”,现在程序按预期工作。如果未输入,则不会输入或立即退出对“waitForSerial…”的第二次调用。 另一个可行的替代方案是冲洗后while循环中的两行 我已经排除了这可能是一个问题:eclipse,程序员,坏的串行连接 更新: 如果flush之前的println不存
void flushReceiveBuffer(){
while(Serial.available()){
Serial.read();
delayMicroseconds(200); //wait for the buffer that may be filled simultaneously
}
}
这是什么Arduino?它是一个atmega328,我正在使用eclipse。请提供有关eclipse的更多详细信息。什么插件?Sloeber?版本:Neon(4.6)构建id:I20160606-1100 CDT C/C++开发工具AVR插件2.4.2你认为这是Eclipse的问题吗?我更接近于一个解决方案:见上面我编辑的文本。
#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(){
}