两个Arduino开发板之间的串行通信

时间:2019-05-11 18:39:45

标签: arduino serial-communication

我正在尝试在两个Arduino之间进行串行通信。

我使用了此circuit diagram,并且此代码运行良好;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    switch(Serial.read())
    { case 'A':
      digitalWrite(13,HIGH);
      break;
      case 'B':
      digitalWrite(13,LOW);
      break;
    }
}
}

但是我不想使用开关盒。我想使用if条件。我正在尝试这段代码;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    if(Serial.read()=='A')
    {
      digitalWrite(13,HIGH);
    }
    else if(Serial.read()=='B')
    {
      digitalWrite(13,LOW);
    }
}
}

但是它不起作用。我的问题是;为什么在开关盒中起作用,但在if条件下不起作用。我的错在哪里你能解决吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

我已经尝试了两种代码,但我认为问题在于数据读取。这是我的测试代码。 发件人代码:

void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.println("A"),
  delay(1000);
  Serial.println("B"),
  delay(1000);
}

接收方代码:

int data;
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
if (Serial.available()) {
    data = Serial.read();
    if(data=='A')
    {
      digitalWrite(13,HIGH);
    }
    else if(data=='B')
    {
      digitalWrite(13,LOW);
    }
  }
}

当您尝试测试从串行通信读取的数据时,将缓冲区保存到变量然后执行所有控制任务始终是一个好习惯。这样,您可以相信数据始终是相同的。这里有更严格的解释。 当您执行一个if语句(如您所测试的语句)时,实际上并没有在一个循环中测试相同的值。if(Serial.read()=='A')else if(Serial.read()=='B')实际上在两个不同的时间测试了来自串行的两个不同的读数。如果改为使用data = Serial.read()进行单个读数,然后将存储在变量中的读数与期望值(例如data == 'A')进行比较,则读数将只执行一次,并在所有循环中“保持不变”。 请注意,在我的测试中,它是使用char('')而不是(“”)进行比较的。

希望我已经帮助您解决了问题。让我们知道它对您有用