我遇到Arduino通信问题。这很难描述所以我不能在标题中使用它。无论如何,这里有以下内容:
所以我的接收端有这个代码:
if(Serial1.available())
{
while(Serial1.available())
{
uint8_t inByte = Serial1.read();
inByte = inByte ^ k;
Serial.write(inByte);
}
Serial.println(" done");
}
它应该在一行打印并在完成后打印完成。 Serial1.available()
似乎跳过下一个Serial1.available()
,我不知道发生了什么。无论如何,这是我目前的,糟糕的,输出:
h done
e done
l done
l done
o done
done
应该是:
hello done
我很抱歉,如果这可以说得更好但是现在我可以打字,我的大脑有点痛苦。我从未在Windows c ++控制台应用程序中遇到过这种行为。
答案 0 :(得分:5)
如果你在循环()中调用该例程然后是,它将从串行缓冲区读取并立即返回,因为你可能没有足够快地发送数据。
处理此类事情的更好方法是使用控制字符来指示消息的结束,或者如果您有预期接收的特定数据格式,则保留已经进入的字符数。达到了数据格式限制。
这里有一些你可能会觉得有用的讨论:Serial Duplex using Arduino此外还有Arduino IDE附带的示例草图:菜单:示例:通信:
另外,阅读Arduino Serial列表下的所有条目。那里好东西。
因此,您使用串行输入开发的例程实际上取决于您的项目和您收到的数据类型。在上面的示例中,如果您要使用控件char,它可能如下所示:
while(Serial1.available()){
char c = Serial1.read();
if (c == '*'){
Serial.println(" done");
} else {
Serial.write(c);
}
}