2012-10-05 35 views
2

我遇到了Arduino通信的问题。这很难描述,所以我不能适应标题。反正这里有以下几种: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

如果你拨打的循环,常规(),然后是的,它将从串行缓冲器读出并立即返回,因为你可能不发送数据速度不够快。

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

这里有讨论,你可能会发现有用:Serial Duplex using Arduino还有一些例如勾勒那艘与Arduino的IDE:菜单:例如:通讯:

而且,读下Serial清单Arduino的所有条目。那里好东西。

所以,你与串行输入工作发展例行真的取决于你的项目,您收到的数据类型。在你上面的例子中,如果你使用控件字符,它可能看起来像这样:

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

    if (c == '*'){ 
     Serial.println(" done"); 
    } else { 
     Serial.write(c); 
    } 
} 
+1

非常感谢。在Arduino这样的嵌入式系统领域,我仍然是一个小菜鸟,我已经被大型架构和窗口这样的框架托起了多年,我已经忘记了低级别的问题。 –

+0

是的 - 我已经把我的头发拉出来,有时候会与系列内容摔跤 - 比如需要接收大量数据。如果您还没有在http://arduino.cc/forum/上查看论坛 - 巨大的社区并且非常友好。干杯。 –