问题描述
我正在尝试编写串行读取功能。该函数将为我提供“#”(开始字符)和“ *”(结束字符)之间的数据。我试图写它,看起来好像是工作,但不是很完美。问题是:
我有两个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上控制台映像
解决方法
我怀疑您遇到同步问题。不过,我可能错了,目前无法测试。
我建议尝试在发送方上插入延迟,例如:
String readed;
while (Serial.available() > 0)
{
readed += Serial.read();
}
delay(10);
Serial.println("#MARCO*");
看到读取器 Serial.available()的返回值也很有趣。同样,不是100%肯定,但是我相信缓冲区可能已满(the buffer holds 64 bytes)。