arduino - 我的串行超时功能在第一次调用时有效,但在第二次调用时无效
问题描述
我想阅读 te 序列并设置了超时功能。
我想阅读信件或日期,但如果没有发送任何内容,则让程序继续。
我几乎整天都在研究这个问题,并且可以将其缩小到可能的解决方案。但我不知道为什么这是有效的。
我输入了“Serial.flush()”,现在程序按预期工作。如果没有放入,则不会输入对“waitForSerial...”的第二次调用,或立即退出。另一个可行的替代方法是刷新后while循环中的两行。
我已经排除了它可能是一个问题:eclipse,程序员,坏的串行连接。
更新: 如果刷新之前的 println 不存在,那么它也不起作用。怎么回事?
UPDATE2: 我想我知道原因:我用“\r\n”发送串行数据。这封信让我的 timeOutfunction 退出并继续执行代码。使用循环和 Serial.read() 我想清空接收缓冲区。在清空它时,它是空的,但仍然被传入的 serial.data 填充。然后退出循环,但接收缓冲区仍在填充。当代码在“waitForSerialAndTimeOut(15000)”处执行时,接收缓冲区被填充而不被注意,因此该函数让代码正常运行,因为会有有效的输入。
新的接收缓冲区清空功能:
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(){
}
解决方案
推荐阅读
- javascript - SVG 路径点在纬度和经度,而不是 SVG 的一侧
- vba - 如何提高 VBA 代码的速度和效率
- html - 背景图像未显示在 div 中
- spring-cloud - Spring boot feign fallback 附加参数
- java - 当已经在底部并添加新项目时,将 recyclerView 保持在底部
- api - 您可以通过 SkyScanner 的 Travel API 跟踪个人购买吗?
- c++ - 如何在 C++ 中非破坏性地检查目录中的任何内容都不能被写入/删除
- .htaccess - 在启用 GoogleAMP 的页面中增加缓存“从 CDN 加载的 Javascript”?
- r - 使用 ggplot 过滤时,“美学必须是任一长度”
- c# - C# - Selenium - UI 测试 - IWebDriver - 对象引用未设置为对象的实例