Arduino串行通信未收到整个消息

Joe*_*res 2 serial-port communication arduino

我对Arduino通信有疑问.这很难描述,所以我不能在标题中使用它.无论如何,这里有以下内容:

所以我的接收端有这个代码:

if(Serial1.available())
{
    while(Serial1.available())
    {
        uint8_t inByte = Serial1.read();

        inByte = inByte ^ k;

        Serial.write(inByte); 
    }

    Serial.println(" done");
}
Run Code Online (Sandbox Code Playgroud)

它应该在一行打印并在完成后打印完成.在Serial1.available()似乎跳过下Serial1.available(),我不知道发生了什么事情.无论如何这里是我当前的,坏的,输出:

h done
e done
l done
l done
o done

done
Run Code Online (Sandbox Code Playgroud)

应该是什么时候:

hello done
Run Code Online (Sandbox Code Playgroud)

我很抱歉,如果这可以说得更好但是现在我可以打字,我的大脑有点痛苦.我从未在Windows c ++控制台应用程序中遇到过这种行为.

No *_*ing 5

如果你在循环()中调用该例程然后是,它将从串行缓冲区读取并立即返回,因为你可能没有足够快地发送数据.

处理此类事情的更好方法是使用控制字符表示消息的结束,或者如果您有预期接收的特定数据格式,则保留在数据格式之前进入的字符计数达到限制.

这里有一些你可能会觉得有用的讨论:使用Arduino的串行双工还有Arduino IDE附带的示例草图:菜单:示例:通信:

另外,阅读Arduino Serial列表下的所有条目.那里好东西.

因此,您使用串行输入开发的例程实际上取决于您的项目和您收到的数据类型.在上面的示例中,如果您要使用控件char,它可能如下所示:

 while(Serial1.available()){
   char c = Serial1.read();

   if (c == '*'){
       Serial.println(" done");
   } else {
       Serial.write(c); 
   } 
 }
Run Code Online (Sandbox Code Playgroud)