Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino用十六进制创建dec_Arduino - Fatal编程技术网

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,然后把它移到了}之后。但是谢谢!