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
对象作为参数。
我想使用 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
对象作为参数。