2

我的 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++ 控制台应用程序中遇到过这种行为。

4

1 回答 1

5

如果您在 loop() 中调用该例程,那么是的,它将从串行缓冲区读取并立即返回,因为您可能发送数据的速度不够快。

处理这类事情的一个更好的方法是使用一个控制字符来指示消息的结束,或者如果你有一个你希望接收的特定数据格式,那么在数据格式之前保留已经进入的字符的计数达到极限。

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

此外,请阅读 Arduino 的序列列表下的所有条目。那里有好东西。

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

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

   if (c == '*'){
       Serial.println(" done");
   } else {
       Serial.write(c); 
   } 
 }
于 2012-10-06T00:13:29.487 回答