【问题标题】:Serial Communication Between Two Arduino Boards两个 Arduino 板之间的串行通信
【发布时间】:2019-05-12 04:31:32
【问题描述】:

我正在尝试在两个 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 条件。我的错在哪里?你能解决它吗?

谢谢。

【问题讨论】:

    标签: arduino serial-communication


    【解决方案1】:

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

    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 ('') 而不是 ("") 进行的比较。

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

    【讨论】:

    • 谢谢老兄,它有效!但我还有一个问题。仅当我们仅发送 1 个字符(如 "A")时,这才完美运行。如果我想从发送者发送"Arda",并在接收者中检查这个字符串;我该怎么办?
    • 发送者:void setup() { Serial.begin(9600); } void loop() { Serial.println("Alpha"); delay(1000); Serial.println("Beta"); delay(1000); } 接收者代码:String data; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { while(Serial.available()){ data = Serial.readStringUntil('\r'); //delay(100); Serial.println(data); if(data=="Alpha") { digitalWrite(13,HIGH); } else if(data=="Beta") { digitalWrite(13,LOW); } } } 变量需要是字符串。 '\r' 是 char @ 字符串结尾。
    • 没有进入if条件
    • 我已经对此进行了测试,并且对我来说这两个代码(发送方和接收方)都没有问题
    • 也许检查您的解决方案的发送方部分,看看您是否有延迟,以便接收方有时间阅读和执行代码。
    猜你喜欢
    • 2020-12-18
    • 2017-01-14
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多