Различные результаты между Serial.print и Serial.printf в ESP32 - PullRequest
0 голосов
/ 15 марта 2020

Я хочу напечатать мою строковую переменную, используя метод printf:

id = 6415F1BF713 C

  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);

1 Ответ

1 голос
/ 15 марта 2020

Вы не предложили достаточно кода для правильной отладки, но я предполагаю, что вы имеете в виду

String id = "6415F1BF713C";

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

Формат %s в методе printf() предполагает получение C / C ++ char *, а не String. Когда вы передали ему String, он напечатал адрес памяти объекта String - четыре символа, которые, как вы видели, будут выглядеть как мусор.

C и C ++ используют char * (указатели на символы) и char [] (массивы символов) для представления строк. Они отличаются от класса Arduino String, и люди часто путают их.

Чтобы использовать метод printf() с String, вам необходимо получить указатель на строку C, например:

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

Причина, по которой это:

Serial.print(id);

работает, заключается в том, что метод print() имеет форму, которая специально ожидает принять объект String в качестве аргумента.

...