两个 Arduino 板之间的串行通信

Serial Communication Between Two Arduino Boards

我正在尝试在两个 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;
    }
}
}

但我不想使用 switch-case。我想使用 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);
    }
}
}

但是没用。我的问题是;为什么适用于 switch-case 但不适用于 if 条件。我的错在哪里?你能修好吗?

谢谢。

两种代码我都试过了,我认为问题出在数据读取上。下面是我的测试代码。 发件人代码:

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' 进行比较时,读数仅完成一次并且 "remain the same" 通过整个循环。 请注意,在我的测试中,它是用 char ('') 而不是 ("") 进行的比较。

希望我帮助您解决了问题。让我们知道它适合您