Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 我的串行timout函数在第一次调用时有效,但在第二次调用时无效_Arduino_Serial Port_Atmega - Fatal编程技术网

Arduino 我的串行timout函数在第一次调用时有效,但在第二次调用时无效

Arduino 我的串行timout函数在第一次调用时有效,但在第二次调用时无效,arduino,serial-port,atmega,Arduino,Serial Port,Atmega,我想读te串行,并已做了一个超时功能 我想阅读信件或日期,但如果没有发送任何内容,则让程序继续 我几乎一整天都在研究这个问题,可以把它缩小到一个可能的解决方案。但我不知道为什么这是工作 我输入了一个“Serial.flush()”,现在程序按预期工作。如果未输入,则不会输入或立即退出对“waitForSerial…”的第二次调用。 另一个可行的替代方案是冲洗后while循环中的两行 我已经排除了这可能是一个问题:eclipse,程序员,坏的串行连接 更新: 如果flush之前的println不存

我想读te串行,并已做了一个超时功能

我想阅读信件或日期,但如果没有发送任何内容,则让程序继续

我几乎一整天都在研究这个问题,可以把它缩小到一个可能的解决方案。但我不知道为什么这是工作

我输入了一个“Serial.flush()”,现在程序按预期工作。如果未输入,则不会输入或立即退出对“waitForSerial…”的第二次调用。 另一个可行的替代方案是冲洗后while循环中的两行

我已经排除了这可能是一个问题:eclipse,程序员,坏的串行连接

更新: 如果flush之前的println不存在,那么它也不起作用。WTF

更新2: 我想我知道原因: 我发送带有“\r\n”的串行数据。这封信让我的timeOutfunction退出并继续执行代码。对于循环和Serial.read(),我想清空接收缓冲区。当清空它时,它是空的,但仍然充满了传入的serial.data。然后退出循环,但接收缓冲区仍在填充。当代码在“waitForSerialAndTimeOut(15000)”执行时,receivebuffer会在未被注意的情况下被填充,因此函数会让代码正常运行,因为会有有效的输入

新的receiverbuffer emtpying功能:

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(){

}