2014-09-25 66 views
1

我遇到了麻煩,我有一臺具有串行通信的小型遊戲機,我必須發送一個十六進制值,因此它可以用十六進制值進行響應,其中有十六進制值一個我需要提取的數字。Arduino在讀取後丟失串行字節

隨着我在C#中已經writen一個客戶它完美的作品,我得到的每一個字節,

但隨着Arduino的我得到這個: '00 03 03 12' 在那裏我normaly應該得到這樣的:01 10 00 03 43 20 03 12',你會看到我丟失了一半的字節。

我嘗試了一切,我沒有得到它的周圍。

當我與arduino和Pc通信時,所有的讀寫操作都是完美的。但與遊戲機只發送工程很好,但是當我收到數據我鬆散它像上面。 謝謝

這裏是代碼:

void setup() 
{ 
    Serial3.begin(19200, SERIAL_8E1); 
    Serial.begin(19200, SERIAL_8E1); 
    delay(1000); 
} 

void statsP() 
{ 
    delay(400); 
    Serial3.write(0x01); 
    Serial3.write(0x10); 
    delay(300); 
} 

void generalpol() 
{ 
    delay(200); 
    Serial3.write(0x80); 
    Serial3.write(0x81); 
} 

void loop() 
{ 
    generalpol(); 
    statsP(); 
    if(Serial3.available()){ 
    char commandbuffer; 
    int j = Serial3.available(); 
    for (int i =0 ; i<j ; i++) 
    { 
     while(Serial3.available()) { 
     commandbuffer = Serial3.read(); 
     Serial.write(commandbuffer); 
     }  
    } 
    } 
} 

回答

0

我會嘗試:

char commandbuffer; 

while(Serial3.available() > 0){ 
    commandbuffer = Serial3.read(); 
    Serial.write(commandbuffer,HEX); 
} 

但是,你需要確保你已經收到了所有的字符,你回去之前到loop()例程的開始並開始傳輸字符。因爲與循環執行的速度相比,字符進入Arduino的速度非常慢。 12總是最後一個字符還是總是8個字符?

如果12總是最後一個字符我想補充:

while (commandbuffer != 12){ 
    while(Serial3.available() > 0){ 
     commandbuffer = Serial3.read(); 
     Serial.write(commandbuffer,HEX); 
    } 
} 

當然,現在你需要的情況下,12還沒有出現增加超時,我離開,作爲一個練習。

0

我會嘗試這個(而不是generalpol後statsP()部分()和):

char commandbuffer; 
if(Serial3.available() > 0){ 
    commandbuffer = Serial3.read(); 
    Serial.write(commandbuffer,HEX); 
} 

我認爲你只需要在Serial3的接收緩衝區中檢測到「東西」,讀取它(也就是說,將該字節從緩衝區中移出),然後像字節(以十六進制形式)發送到串行。 我希望你把你的功能generalpol()和statsP()延遲是正常

0

謝謝你的建議我發現它是在串行配置的問題,因爲Windows自動處理一些配置,在arduino中你必須手動配置它像喚醒位,所以我將konfig改爲奇偶校驗非停止位2,現在它工作很好再次感謝

相關問題