Arduino:等待串行输入

时间:2016-09-19 09:14:08

标签: arduino serial-port

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

 SSL_CTX_set_cipher_list(ctx, "HIGH:MEDIUM:!eNULL:!aNULL:!RC4");

2 个答案:

答案 0 :(得分:1)

这就是答案。

int switch1 = 2;
int motorled1 = 3;
int switch2 = 4;
int motorled2 = 5;
int d1 = 0;
int d2 = 0;
int buzzer;
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);
    }
  }
}

答案 1 :(得分:0)

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

在当前状态下,代码将反复循环,检查其中一个按钮是否被按下。

现在,有两种方法可以实现这一目标:

  • 制作合适的state machine设计,这是首选的方式
  • 或者只是等待序列在某个时候可用。

对于第二种解决方案,您可以替换

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

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

通过

while (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)和{{1 }}。然后,在程序的顶部添加:

else if (d2==1 && serial_read == true)

这是基本的想法。我会让你理清各种错误和改进(例如再次将int serial_read = false; if(Serial.available() > 0) { reset1 = (Serial.read()); serial_read = true; } 设置为serial_read)作为练习。

我还强烈建议你阅读一般的编程,特别是C编程。我还建议你尝试坚持一些约定来缩进你的代码。没有比带有混合缩进的代码更糟糕的了。