Arduino用十六进制创建dec
我想在串行监视器中写入一个十六进制数,并将其转换为十进制整数Arduino用十六进制创建dec,arduino,Arduino,我想在串行监视器中写入一个十六进制数,并将其转换为十进制整数 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'; }
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
在Arduino上只有2个字节,并且您试图在其中存储3个字节
您可以在串行上看到4
字节,因为print()
在打印前将int
提升为long
。由于在int
变量中存储2
完整字节后,该变量包含一个负值(0xFFFF
是一个负int),因此提升为long会根据两个补码将整数扩展为更多的“F”,从而获得0xffffff
解决方案是声明color
类型为unsignedlong
您应该这样做:
无符号长颜色=0;
布尔忽略_in=false;
布尔值in_done=false;
...
if(Serial.available()){
忽略_in=false;
字节c=串行.read();
字节输入;
如果('A'请显示更多代码,这似乎是某个循环的内部部分。什么是55
??请尝试使用无符号int作为变量color.color=(0*16)+('F'-55),它只不过是color=0+(70-55)十六进制中的15是F。这就是为什么你会得到……如果整数只有2个字节,你如何解释输出是F,然后是FF,然后是FFF,最后是FFFFFF?而且,你的16位左移似乎不正确。@linuxfan我在标题中用解释编辑了我的答案,我用OP使用的完全相同的数学替换了移位。:)它起作用了。谢谢!但是顺便说一句:我找到了一个更好的方法!我只是拿了Serial.print,然后把它移到了}之后。但是谢谢!