Arduino用HEX创建了dec

Bun*_*er. 2 arduino

我想在串行监视器中写一个十六进制数字,这应该转换为十进制int.

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');
}
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?如果我写FFFFFF它显示:

F
FF
FFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
Run Code Online (Sandbox Code Playgroud)

Pat*_*tin 5

问题是你声明colorint,但在Arduinoint上只有2字节,你试图在其中存储字节.3

4串行上看到字节,因为在打印之前将其print()提升intlong.因为在你2int变量中存储了完整的字节之后,它包含一个负值(0xFFFF是一个负数int),所以对于long的提升会按照两个补码 处方扩展整个数字,然后得到更多的"F" 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;
}

...
Run Code Online (Sandbox Code Playgroud)