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

Wil*_*oso 5 arduino esp32

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

\n\n

编号 = 6415F1BF713C

\n\n
  Serial.printf("id: %s\\n\\n", id);\n  Serial.print(id);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到的结果是:

\n\n
id: \xe2\xb8\xae\xe2\xb8\xae\xe2\xb8\xae?\n6415F1BF713C\n
Run Code Online (Sandbox Code Playgroud)\n\n

有什么问题吗?

\n\n

谢谢。

\n\n

更新 :

\n\n
//get device id\nString getDeviceID() {\n  uint64_t chipid = ESP.getEfuseMac(); // The chip ID is essentially its MAC address(length: 6 bytes).\n  uint16_t chip = (uint16_t)(chipid >> 32);\n\n  char devID[40];\n  snprintf(devID, 40, "%04X%08X", chip, (uint32_t)chipid);\n\n  return devID;\n}\nString id = getDeviceID();\n\nSerial.printf("id: %s\\n\\n", id);\nSerial.print(id);\n
Run Code Online (Sandbox Code Playgroud)\n

rom*_*key 9

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

String id = "6415F1BF713C";

Serial.printf("id: %s\n\n", id);
Serial.print(id);
Run Code Online (Sandbox Code Playgroud)

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

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

要使用printf()带有 a 的方法,String您需要获取其 C 字符串指针,如下所示:

Serial.printf("id: %s\n\n", id.c_str());
Run Code Online (Sandbox Code Playgroud)

原因是这样的:

Serial.print(id);
Run Code Online (Sandbox Code Playgroud)

有效的地方在于该print()方法具有一种明确期望将String对象作为参数的形式。