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_read
到false
)作为练习。
我还强烈建议您阅读一些有关编程的知识,特别是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);
}
}
}