两个arduino之间的串行通讯

问题描述

我正在尝试编写串行读取功能。该函数将为我提供“#”(开始字符)和“ *”(结束字符)之间的数据。我试图写它,看起来好像是工作,但不是很完美。问题是:

我有两个arduino。其中之一发送“ marcO”,其他arduino则将其阅读。如果读取的数据是“ marcO”,则将其写入串行监视器“ marcOCORRECT”,否则将其写入到串行监视器中。通常,它必须只写“ marcOCORRECT”,因为我只发送“ marcO”,但不发送。它也写其他东西。我也尝试过降低波特率,但还是一样。我该如何解决

发件人代码

#define BAUD_RATE 38400

void setup()
{
  Serial.begin(BAUD_RATE);
}
String readed = "";
void loop()
{
  String readed;
  while (Serial.available() > 0)
  {
    readed += Serial.read();
  }

  Serial.println("#marcO*");

}

阅读器代码

#define BAUD_RATE 38400
#define MSG_START '#'
#define MSG_END '*'

String readed;
char readedChar;
bool msgStart = false;

String serialReadFunc()
{
  readedChar = '0';
  readed = "";
  while (Serial.available() > 0 || msgStart)
  {
    if (readedChar == MSG_START)
    {
      msgStart = true;
    }
    readedChar = (char)Serial.read();

    if (readedChar == MSG_END)
    {
      msgStart = false;
      break;
    }

    if (msgStart)
    {
      readed += readedChar;
    }
  }
  return readed;
}

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

void loop()
{
  if (serialReadFunc() == "marcO")
  {
    Serial.println("marcOCORRECT");
  }
  else
    Serial.println(readed);
  
}

在Proteus上控制台映像

Console Image Proteus

解决方法

我怀疑您遇到同步问题。不过,我可能错了,目前无法测试。

我建议尝试在发送方上插入延迟,例如:

String readed;
while (Serial.available() > 0)
{
  readed += Serial.read();
}
delay(10);
Serial.println("#MARCO*");

看到读取器 Serial.available()的返回值也很有趣。同样,不是100%肯定,但是我相信缓冲区可能已满(the buffer holds 64 bytes)。