ESP32中Serial.print和Serial.printf之间的结果不同



我想使用printf方法打印字符串变量:

id=6415F1BF713C

Serial.printf("id: %snn", id);
Serial.print(id);

我得到的结果是:

id: ⸮⸮⸮?
6415F1BF713C

有什么不对的地方吗?

谢谢。

更新:

//get device id
String getDeviceID() {
uint64_t chipid = ESP.getEfuseMac(); // The chip ID is essentially its MAC address(length: 6 bytes).
uint16_t chip = (uint16_t)(chipid >> 32);
char devID[40];
snprintf(devID, 40, "%04X%08X", chip, (uint32_t)chipid);
return devID;
}
String id = getDeviceID();
Serial.printf("id: %snn", id);
Serial.print(id);

您没有提供足够的代码来正确调试它,但我猜您的意思是

String id = "6415F1BF713C";
Serial.printf("id: %snn", id);
Serial.print(id);

printf()方法中的%s格式需要采用C/C++char *,而不是String。当您向它传递String时,它会打印String对象的内存地址——正如您所看到的,这四个字符将显示为垃圾。

C和C++使用char *(指向字符的指针(和char [](字符数组(来表示字符串。这些与ArduinoString类不同,人们经常将它们混淆。

要将printf()方法与String一起使用,您需要获取其C字符串指针,如下所示:

Serial.printf("id: %snn", id.c_str());

原因是:

Serial.print(id);

工作原理是print()方法具有一个专门期望将String对象作为参数的形式。

最新更新