2017-06-07 8 views
1

以下のコードを使用して、私はArduinoシリアル経由で受け取った値を印刷しようとしています。しかし値は2回印刷されます。プリント値のうちの一方が第i = Serial.parseInt();が読取り値を出力し、i変数に0を返すための値が正常に印刷されたことを意味する、すなわちだ常に0シリアル値が送信されない値と共に2回印刷されるのはなぜですか?

byte b; 
int i; 

void setup() { 
    Serial.begin(115200); 
    Serial.setTimeout(10); 
} 

void loop() { 
    while(Serial.available() == 0) {} 
    i = Serial.parseInt(); 
    Serial.println(i); 
} 

EXAMPLE: value sent is 15 
Serial monitor output: 15 
         0 

EXAMPLE: value sent is 99 
Serial monitor output: 99 
         0 

答えて

3

あります。二Serial.println(i);

、あなたはちょうど私があなたが改行文字とシリアルモニターから送信していると仮定しています0

+0

を? 0を出力すると、他の機能は動作しません。明るさと言うと、値が50の場合、明るさは合計の半分になります。しかし、0になると明るさが失われます。 – nawas

+0

[この例を見る](https://www.arduino.cc/en/Serial/Read)実際にシリアルモニターには、書き込んだ値と成功した状態を表示しています。 – Adnand

+0

あなたは何をしたいですか? – Adnand

1

i値を、印刷します。

これはあなたのコードで起こっていることです。

  1. 15\nを送信しています。
  2. Serial.parseInt()は、シリアルバッファから15とを読み取り、\nで停止します。その後、15を返します。
  3. \nがまだバッファにあるため、Serial.parseInt()が再び呼び出されます。
  4. Serial.parseInt()は、数字の文字が見つかるまで、シリアルバッファから数字以外の文字をすべて破棄します。
  5. \nを削除して数字を待ちます。
  6. Serial.parseInt()タイムアウトして0を返します。

あなたが二Serial.parseInt()の呼び出しを防ぎたい場合は、改行文字なしで文字列を送信したり、このようなシリアルバッファ空にする必要があります。これを回避するために、どのように

void loop() { 
    while(Serial.available() == 0) {} 
    i = Serial.parseInt(); 
    Serial.println(i); 
    while(Serial.available() > 0) Serial.read(); // empty the serial buffer by reading everything from it 
} 
関連する問題