Arduino:等待串口输入

问题描述:

我在写一个简单的arduino代码。我有两个LED和相应的两个开关。当按下一个开关时,一个指示灯亮而另一个熄灭。然后有一个Serial.read函数,它从计算机读取重置。然后两个开关都关闭了。之后,按下其他开关,并打开其他指示灯。我的问题是当一个开关在其他开关上时应该不工作,直到Serial.read发生。但在我的情况下,如果按下开关2时,led1处于开启状态,led2处于开启状态,led1处于关闭状态。但那不是我想要的操作。我想要做的逻辑是,当led1打开时,如果我按下switch2,led2不应该打开并等待Serial.read发生。这是我的代码。我需要知道在逻辑中应该修正什么:Arduino:等待串口输入

int switch1 = 2; 
int motorled1 = 3; 
int switch2 = 4; 
int motorled2 = 5; 
int d1=2; 
int d2=3; 
int reset1 = 0; 
int reset2= 0; 


void setup() { 
    // put your setup code here, to run once: 
    Serial.begin(9600); 
    pinMode(2, INPUT); 
    pinMode(4, INPUT); 
    pinMode(3, OUTPUT); 
    pinMode(5, OUTPUT); 
} 

void loop() { 
    // put your main code here, to run repeatedly: 
    d1=digitalRead(2); 
    d2=digitalRead(4); 

    if (d1==1) 
    { 
    digitalWrite(3, HIGH); 
    digitalWrite(5, LOW); 

    if (Serial.available() > 0) 
    { 
     Serial.write(1); 
    } 
    if (Serial.available() > 0) 
    { 
     reset1 = (Serial.read()); 

     digitalWrite(motorled1, LOW); 
     digitalWrite(motorled2, LOW); 
    } 
    } 
    else if (d2==1) 
    { 
    digitalWrite(3, LOW); 
    digitalWrite(5, HIGH); 

    if (Serial.available() > 0) 
    { 
     Serial.write(2); 
    } 
    if (Serial.available() > 0) 
    { 
     reset2 = (Serial.read()); 

     digitalWrite(motorled1, LOW); 
     digitalWrite(motorled2, LOW); 
    } 
    } 
} 

您似乎在使用某种异步代码结构。这是一件好事,但我不确定这是否是你想要做的。

在当前状态下,代码会一直循环遍历,检查是否按下了其中一个按钮。

现在,有实现这一目标的方式有两种:

  • 无论是作出正确的state machine设计,这将是首选方法
  • 或者等待串行可用在一些点。

对于第二个解决方案,您可以通过

while (Serial.available() <= 0) 
{} 
reset1 = (Serial.read()); 

digitalWrite(motorled1, LOW); 
digitalWrite(motorled2, LOW); 

基本上无所事事更换

if (Serial.available() > 0) 
{ 
    reset1 = (Serial.read()); 

    digitalWrite(motorled1, LOW); 
    digitalWrite(motorled2, LOW); 
} 

而没有任何串行端口。当然,这会完全冻结其余的程序,并不是很灵活。

对于第一种方式,再次有多种方式来做到这一点。由于您似乎不熟悉C编程(没有冒犯性),因此最简单的方法之一是将if (d1==1)else if (d2==1)声明更改为if (d1==1 && serial_read == false)else if (d2==1 && serial_read == true)。然后,在程序顶部添加:

int serial_read = false; 
if(Serial.available() > 0) 
{ 
    reset1 = (Serial.read()); 
    serial_read = true; 
} 

这是基本思想。我会让你理清各种错误和改进(例如再次设置serial_readfalse)作为练习。

我还强烈建议您阅读一些有关编程的知识,特别是C编程。我还建议您尝试遵守一些缩进代码的惯例。没有比混合缩进代码更糟的了。

这就是答案。 int switch1 = 2; int motorled1 = 3; int switch2 = 4; int motorled2 = 5; int d1 = 0; int d2 = 0; int蜂鸣器; char reset1;

void setup() { 
    // put your setup code here, to run once: 
    Serial.begin(9600); 

    pinMode(2, INPUT); 
    pinMode(4, INPUT); 
    pinMode(3, OUTPUT); 
    pinMode(5, OUTPUT); 

} 

void loop() { 
    // put your main code here, to run repeatedly: 

    d1 = digitalRead(2); 
    d2 = digitalRead(4); 
    if (d1 == 1 && buzzer == 0) 

    { 
    digitalWrite(motorled1, HIGH); 
    buzzer = 1; 

    } 


    else if (d2 == 1 && buzzer == 0) 
    { 
    digitalWrite(motorled2, HIGH); 
    buzzer = 2; 
    } 

    if (Serial.available() > 0) 

    { 
    (Serial.write(buzzer)); 

    reset1 = (Serial.read()); 
    buzzer = 0; 


    if (reset1 == 'R') 
    Serial.println("LED is off"); 
    { digitalWrite(motorled1, LOW); 
     digitalWrite(motorled2, LOW); 

    } 
    } 
}