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

Different result between Serial.print and Serial.printf in ESP32

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

id = 6415F1BF713C

  Serial.printf("id: %s\n\n", 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: %s\n\n", id);
Serial.print(id);

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

String id = "6415F1BF713C";

Serial.printf("id: %s\n\n", id);
Serial.print(id);

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

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

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

Serial.printf("id: %s\n\n", id.c_str());

这样做的原因:

Serial.print(id);

有效的是 print() 方法有一种形式,它特别希望将 String 对象作为参数。