2012-10-05 37 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/上查看論壇 - 巨大的社區並且非常友好。乾杯。 –