2016-07-28 56 views
1

這是Arduino功能sscanf()的一個奇怪問題。如果1字節值(bool,byte,char)跟在其後面,它會將掃描的整數值的最後一個字節清零(int,long)。在Arduino上使用sscanf()對最後一個字節進行清零

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 
} 

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

我嘗試了兩種不同的Arduinos,結果是一樣的。爲什麼會發生?

+0

您是否嘗試過'的sscanf( 「7FFF F」, 「%04X%X」,與someInt,與someByte);'? –

+0

請添加'loop()'的代碼 –

+0

給出1字節緩衝區的字節地址,其中預期2字節的緩衝區看起來很糟糕。如果語言是C,*未定義行爲*將被調用。 – MikeCAT

回答

1

這是非法的:

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

sscanf的家庭並不類型安全。程序員必須控制代碼(printf家族也很危險 - sscanf更多)。

第三個參數(以及後面的參數,如果有多個%d或%X)必須是整數(s)的地址。 「平臺上自然」意義上的整數,這裏是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; 
... 
} 
相關問題