首页 > 解决方案 > 我的串行超时功能在第一次调用时有效,但在第二次调用时无效

问题描述

我想阅读 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(){

}


标签: arduinoserial-portatmega

解决方案


推荐阅读