gpt4 book ai didi

Arduino 用十六进制创建 dec

转载 作者:行者123 更新时间:2023-12-04 04:39:00 32 4
gpt4 key购买 nike

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

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

最佳答案

问题是您将 color 声明为 int,但 int 上只有 2 字节>Arduino 并且您正在尝试在其中存储 3 字节。

您会在 serial 上看到 4 字节,因为 print()int 提升为 long 在打印之前。由于在 int 变量中存储了 2 个完整字节后,它包含一个值(0xFFFF 是一个负 int ),升级为 long 会根据二进制补码用更多的“F”扩展整个数字 prescriptions ,从而得到0xFFFFFFFF

解决方案是声明 unsigned long 类型的 color


你应该这样做:

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;
}

...

关于Arduino 用十六进制创建 dec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41999602/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com