使用Arduino上的sscanf()将最后一个字节归零

时间:2016-07-28 13:49:21

标签: c++ arduino scanf

这是Arduino函数sscanf()的一个奇怪问题。如果跟随它的是1字节值(intlongbool),它会将扫描整数值(bytechar)的最后一个字节归零。 / p>

int someInt;
byte someByte;

void setup() {
  Serial.begin(9600);

  sscanf("10000 10", "%d %d", &someInt, &someByte);
  Serial.println(someInt); // 9984 (0x2700 not 0x2710)
  Serial.println(someByte); // 10

  sscanf("7FFF F", "%x %x", &someInt, &someByte);
  Serial.println(someInt, HEX); // 7F00 (not 7FFF)
  Serial.println(someByte, HEX); // F
}

void loop() {
  // Some code what uses someInt and someByte
}

如果在someInt中声明的setup()一切正常。

我在两个不同的Arduinos上尝到了它,结果是一样的。为什么会这样?

1 个答案:

答案 0 :(得分:1)

这是非法的:

 sscanf(buf, "%x", /* byte*/ &val ) 

sscanf家族不是类型安全的。程序员必须控制代码(printf系列也很危险 - sscanf甚至更多)。

第三个参数(以及后面的参数,如果有多个%d或%X)必须是整数的地址。整数在“平台上自然”的意义上,这里是2个字节。

您的想法可以写成如下:

int someInt, wrkInt;
byte someByte;

void setup() {
  Serial.begin(9600);

  sscanf("10000 10", "%d %d", &someInt, &wrkInt);  // %X too, rule is the same
  someByte = wrkInt;
...
}