如何清除Arduino中串口的字节?

时间:2018-06-14 08:09:18

标签: c++ loops arduino break arduino-uno

我正在尝试中断串行监视器以执行某个功能并在完成中断的功能后继续执行上一个功能,我的代码如下所示

#define red1 13
#define amber1 12
#define green1 11

void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);  
    pinMode(red1, OUTPUT);
    pinMode(amber1, OUTPUT);
    pinMode(green1, OUTPUT);
}

void Delay(int sec) {
    for(int i=0;i<sec;i++){
        if (Serial.available())
        {
            Button();
            break;
        }
        delay(1);
     }
}

void Light()
{
    digitalWrite(red1,HIGH);
    Delay(5000);
    digitalWrite(red1,LOW);
    digitalWrite(amber1,HIGH);
    Delay(5000);
    digitalWrite(amber1,LOW);
}

void Button()
{
    digitalWrite(red1,LOW);
    digitalWrite(amber1,LOW);      
    digitalWrite(green1,HIGH);
    delay(1000);
    digitalWrite(green1,LOW);
}

void loop() 
{
    Light();  
}

每当我在串行监视器中输入一个值时,执行Button()函数,它会在函数完成后因函数中断而结束,但此函数会不断重复?如何解决这个问题,每当串行监视器中断时,Button()会一次执行,然后继续Light()。 我尝试使用中断,但串行接口缓冲区未被清除,因此它继续保持此功能,如果循环退出,所以我尝试使用return

void Delay(int sec) {
                for(int i=0;i<sec;i++){
                    if (Serial.available())
                    {
                        Button();
                        return;
                    }
                    delay(1);
                 }
            }
the same thing happens 

函数没有退出它不断重复相同,因为串行接口没有从早期的遇到清除,我可以在void loop()中使用serial.available但是每当Arduino处于延迟函数时它的睡眠因此它没有读取串行中断,所以我创建了单独的Delay()  那么如何更改代码以结束此功能并返回Light()

1 个答案:

答案 0 :(得分:0)

  

但未清除串行接口缓冲区

然后你必须清除它:

while (Serial.available())
  Serial.read(); // remove 1 character