2017-08-04 52 views
0

嘗試使用Arduino Uno和標準IDE發送串行消息。解析發送到設備的串行消息時遇到問題。Serial.read()跳過串行輸入

看到如果我包含這一行Serial.println("Serial.available() = " + String(Serial.available()));我將能夠閱讀剩餘的消息。如果這被註釋掉了,我只會看到消息的第一個字母,然後跳過其餘的部分。我看到有沒有添加代碼行的輸出的附加圖像。

// the setup routine runs once when you press reset: 
void setup() { 

    // initialize serial communication at 9600 bits per second: 
    Serial.begin(9600); 
    while (!Serial) {} // wait for serial to be initialized 

    Serial.println("Setup called. Serial port ready."); 

    Serial.println("Waiting for time sync message..."); 
    while (!Serial.available()) {} 
    processSyncMessage(); 
} 

void processSyncMessage() { 

    // parse first letter of message 
    char messageHeader = (char) Serial.read(); 

    switch (messageHeader) { 
    case TIME_HEADER: 
     // do processing 
     break; 
    default: 
     Serial.println("Unknown message sent with header: " + String(messageHeader)); 

     // must include this line in order to see the entire message sent 
     // just calling a println or a Serial.available() doesn't work ???? 
     Serial.println("Serial.available() = " + String(Serial.available())); 

     Serial.println("---start of message"); 
     for (int r = 0; r != -1; r = Serial.read()) { 
     Serial.print((char) r); 
     } 
     Serial.println(); 
     Serial.println("---end of message"); 
     break; 
    } 
} 

Missing Buffer

With printout

是這個主題相關的緩衝區?我可以用fflush(SOME_SECRET_BUFFER)以某種方式沖洗它嗎?

+1

Arduino不是C,刪除標籤。這由'Serial.println(「Serial.available()=」+ String(Serial.available()))演示;' –

+0

setup()只調用一次。您應該定義一個loop()函數並將setup()的最後3行代碼移入其中,以便連續運行。 –

回答

1

你有沒有試過Serial.readString()來解析整個缺失的字符?

+0

如果它不符合你的要求,你可以設置readString()的超時時間,但這不可能 –

0

串行數據一次發送和接收一個字符。在9600波特時,傳輸速率大約爲每毫秒一個字符。

該代碼假定一旦第一個字符到達,它們都有。不是這種情況。增加println會消耗CPU時間,因此會增加延遲。該延遲允許接收原始消息的其餘部分。

此處需要爲您的應用程序提供適當超時的接收函數。

+0

你能提供一個例子嗎? – stevieb