2017-08-04 11 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

によって実証されています。 loop()関数を定義し、setup()のコードの最後の3行を連続して動かす必要があります。 –

答えて

1

あなたはSerial.readString()を試して、欠けている文字全体を解析しましたか?

+0

readString()のタイムアウトを設定することができますが、それはあなたの要件に合っていませんが、それは確かにありません –

0

シリアルデータは一度に1文字ずつ送受信されます。 9600ボーでは、伝送速度はミリ秒あたり約1文字です。

コードでは、一度最初の文字が到着すると、それらのすべてがあることを前提としています。これはそうではありません。 printlnを追加すると、CPU時間が消費されるため、遅延が追加されます。この遅延によって、元のメッセージの残りの部分が受信されます。

アプリケーションに適切なタイムアウトを設定した受信機能が必要です。

+0

例を教えてください。 – stevieb

関連する問題