我想在串行监视器中写一个十六进制数字,这应该转换为十进制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)
问题是你声明color
为int
,但在Arduinoint
上只有2
字节,你试图在其中存储字节.3
您4
在串行上看到字节,因为在打印之前将其print()
提升int
为long
.因为在你2
的int
变量中存储了完整的字节之后,它包含一个负值(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)
归档时间: |
|
查看次数: |
338 次 |
最近记录: |