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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.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:等待串行输入_Arduino_Serial Port - Fatal编程技术网

Arduino:等待串行输入

Arduino:等待串行输入,arduino,serial-port,Arduino,Serial Port,我正在写一个简单的arduino代码。我有两个LED和相应的两个开关。按下一个开关时,一个led点亮,另一个led熄灭。然后有一个Serial.read函数,它从计算机读取重置。然后两个开关都关闭。按下另一个开关后,另一个led亮起。我的问题是,当一个开关打开时,另一个开关在串行读取发生之前不应该工作。但在我的情况下,当led1打开时,如果我按下开关2,led2打开,led1关闭。但这不是我想要的行动。我想做一个逻辑,当led1打开时,如果我按下开关2,led2不应该打开,并等待Serial.r

我正在写一个简单的arduino代码。我有两个LED和相应的两个开关。按下一个开关时,一个led点亮,另一个led熄灭。然后有一个Serial.read函数,它从计算机读取重置。然后两个开关都关闭。按下另一个开关后,另一个led亮起。我的问题是,当一个开关打开时,另一个开关在串行读取发生之前不应该工作。但在我的情况下,当led1打开时,如果我按下开关2,led2打开,led1关闭。但这不是我想要的行动。我想做一个逻辑,当led1打开时,如果我按下开关2,led2不应该打开,并等待Serial.read发生。这是我的密码。我需要知道逻辑中的更正是什么:

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);
    }
  }
}

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

在当前状态下,代码将不断循环,检查是否按下了其中一个按钮

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

  • 或者做一个合适的设计,哪一个是首选的方式
  • 或者只是等待序列号在某个时候可用
对于第二种解决方案,您可以替换

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

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

这是基本思想。作为练习,我将让您整理各种错误和改进(例如再次将
serial\u read
设置为
false

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

这就是答案

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);
    }
  }
}
int serial_read = false;
if(Serial.available() > 0)
{
  reset1 = (Serial.read());
  serial_read = true;
}
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);
    }
  }
}