2017-02-02 12 views
2

Я хочу записать шестнадцатеричное число в последовательном мониторе, и это нужно преобразовать в десятичный int.Arduino create dec из HEX

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

Попробуйте unsigned int для переменной цвета. – linuxfan

ответ

4

Проблема заключается в том, что вы объявили color в int, но int имеет только 2 байт на Arduino и вы пытаетесь сохранить 3 байт в нем.

Вы видите 4 байт на серийный потому что print() способствует int к long перед печатью его. Так как ваша int переменные содержит отрицательного значения а (0xFFFF отрицательного целого), продвижение долго расширяет целое число с более «F», как в двоичном дополненииprescriptions, получая такой 0xFFFFFFFF.

Решение должно объявлять color типа unsigned long.


Вы должны сделать это:

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, затем FF, затем FFF и, наконец, FFFFFFFF? Более того, ваш сдвиг влево от 16 бит кажется неправильным. – linuxfan

+1

@linuxfan Я отредактировал свой ответ с объяснением в заголовке, и я заменил сдвиг той же самой математикой, используемой OP. :) –

+0

Поздравляем, хорошая работа! – linuxfan

Смежные вопросы