2017-02-02 10 views
2

シリアルモニタに16進数を書きたいので、10進整数に変換する必要があります。Arduinoは16進数で十進数を作成します

LCDShield lcd; 
byte byteR; 
int color = 0; 

if (Serial.available()) { 
    int number; 
    byteR = Serial.read(); 

    if (byteR >= 'A') { 
     number = byteR - 55; 
    } else { 
     number = byteR - '0'; 
    } 
    color = (color * 16) + number; 
    Serial.print(color, HEX); 
    Serial.write('\n'); 
} 

なぜ機能しないのですか?私はFFFFFFを記述する場合、それは示しています

F 
FF 
FFF 
FFFFFFFF 
FFFFFFFF 
FFFFFFFF 
+0

は、より多くのコードを表示してください、これはいくつかのループの内側の一部であるように思われます。 –

+0

何が '55'ですか? –

+0

変数colorにunsigned intを使用してください。 – linuxfan

答えて

4

問題は、intとしてcolorを宣言していることですが、intArduinoのにのみ2バイトを持っており、あなたはそれで3バイトを保存しようとしています。

print()はそれをプリントアウトする前にlongintを促進するため、あなたはシリアル4バイトを参照してください。あなたのint変数が(0xFFFFが負の整数である)値が含まれているので、長いへの昇進は、このように0xFFFFFFFFを取得し、2の補数prescriptionsごとなど、より「F」で全体の数を拡張します。

解決策はunsigned longcolorを宣言することです。


あなたがこれを行う必要があります。

unsigned long color = 0; 
boolean ignore_in = false; 
boolean in_done = false; 

... 

if (Serial.available()) { 
    ignore_in = false; 
    byte c = Serial.read(); 
    byte in; 

    if('A' <= c && c <= 'F') { 
     in = c - 'A' + 10; 
    } else if ('a' <= c && c <= 'f') { 
     in = c - 'a' + 10; 
    } else if ('0' <= c && c <= '9') { 
     in = c - '0'; 
    } else if (c == '\n') { 
     in_done = true; 
     ignore_in = true; 
    } else { 
     // print error: unrecognized character [?] 
     ignore_in = true; 
    } 

    if (!ignore_in) { 
     color = (color << 4) | in; 

     Serial.print(color, HEX); 
     Serial.write('\n'); 
    } 
} 

if (in_done) { 
    // do something with color 

    ... 

    // reset 
    color = 0; 
    in_done = false; 
} 

... 
+1

整数が2の場合バイト、あなたはどのようにF、次にFFF、次にFFF、最後にFFFFFFFFの出力を説明しますか?さらに、16ビットのシフトが正しくないように見えます。 – linuxfan

+1

@linuxfan私はヘッダーの説明で私の答えを編集し、私はOPによって使用された全く同じ数学にシフトを置き換えました。 :) –

+0

おめでとう、良い仕事! – linuxfan

関連する問題