我正在尝试编写一个串行读取函数。该函数将给我一个介于"#"(起始字符(和"*"(结束字符(之间的数据。我试着写它,它看起来有点工作,但并不完美。问题是:
我有两个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上的控制台图像
控制台图像Proteus
我怀疑您有同步问题。不过,我可能错了,目前我无法测试它。
我建议尝试在发件人上插入延迟,如下所示:
String readed;
while (Serial.available() > 0)
{
readed += Serial.read();
}
delay(10);
Serial.println("#MARCO*");
读卡器Serial.available((的返回值也很有趣。同样,不是100%确定,但我相信缓冲区可能已满(缓冲区可容纳64字节(。