Ввести идентификатор чипа ESP32 в строковую переменную (новичок в Arduino/C++)

Прошло всего несколько дней с тех пор, как я начал использовать Arduino IDE ( программирование ESP32 ). По мере того, как я учусь, я пытаюсь написать несколько фрагментов. Я хотел сохранить идентификатор чипа ESP32 в переменной (предпочтительно в строке?) чтобы я мог сгенерировать уникальное имя устройства. Я просмотрел примеры программ ESP32 и наткнулся на эту программу, которая просто выводит идентификатор чипа на последовательную консоль.

  uint64_t chipid;

  chipid = ESP.getEfuseMac(); //Идентификатор чипа, по сути, является его MAC-адресом(длина: 6 байт).
  Serial.printf("ESP32 Chip ID = %04X", (uint16_t)(chipid >> 32)); //напечатать старшие 2 байта
  Serial.printf("%08X\n", (uint32_t)chipid); //печатает младшие 4 байта.

Теперь это работает нормально, но мне нужно было сохранить его в переменную в следующем формате "ESP32-0A1B3C4D5E6F" ( последняя часть которого-идентификатор чипа/MAC, который составляет 6 байт ). Я немного почитал и в настоящее время читаю, и мне удалось зайти так далеко

  char ssid1[15];
  char ssid2[15];

  uint64_t chipid = ESP.getEfuseMac(); // Идентификатор чипа, по сути, является его MAC-адресом(длина: 6 байт).
  uint16_t chip = (uint16_t)(chipid >> 32);

  snprintf(ssid1, 15, "%04X", chip);
  snprintf(ssid2, 15, "%08X", (uint32_t)chipid);

  Serial.print(ssid1);
  Serial.println(ssid2);

Я пытаюсь прочитать это, которое кажется отличной статьей об обработке строк Arduino, но всего несколько дней назад с Arduino/c++ у меня возникли некоторые трудности с пониманием некоторых концепций. Я работаю на Python, PHP, Javascript, так что, думаю, это займет немного времени. Я получаю желаемый вывод в последовательной консоли, но теперь он мне понадобится в этом формате (MCUDEVICE-0A1B3C4D5E6F). Я уверен, что этот код может быть написан гораздо более приятным и чистым способом, но сейчас мне это нужно, чтобы перейти к другому фрагменту (который зависит от имени устройства в вышеупомянутом формате). Может ли кто-нибудь предоставить некоторые указания, пока я попытаюсь проверить различные способы, которыми я мог бы этого достичь? Я просто хочу быть уверенным, что я не пишу некрасиво (и опасный код - сбои, переполнение буфера и т.д.). Очень ценю любые указатели. Наверное, я начинаю немного параноидально относиться к обработке строк ( особенно на устройствах с низким объемом памяти, таких как обычные микроконтроллеры ).

, 👍4

Обсуждение

Какова цель следующей строки: uint16_t чип = (uint16_t)(идентификатор чипа >>> 32); ? Спасибо, @Itamar Vieira

@ItamarVieira это копирует самые высокие 16 бит из “chipid” (который является 48-разрядным значением в 64-разрядной переменной) в переменную “chip” (которая является 16-разрядной переменной)., @StarCat


3 ответа


Лучший ответ:

5

Вы можете объединить всю свою работу в одну строку с помощью snprintf. Вы не ограничены только одной переменной, и вы можете добавить обычный текст:

char ssid[23];

snprintf(ssid, 23, "MCUDEVICE-%04X%08X", chip, (uint32_t)chipid);
,

1

Почему бы вам просто не использовать:

snprintf(ssid, 23, "MCUDEVICE-%llX", ESP.getEfuseMac());

Таким образом, нет необходимости в битовом сдвиге и дополнительных средних переменных...

Просто обратите внимание на заглавную букву X для заглавного результата и маленькую букву "l" для указания типа. (имеется в виду использовать либо llX, либо llx, а не LLX).

,

0

Это работает на ESP32-S3 WROOM на Arduino 1.8.19:

void setup() {
  // поместите сюда свой код установки для однократного запуска:
  Serial.begin(115200);

  String MCUtype = "ESP32s3" ;
  char ssid[14];
  snprintf(ssid, 14, "%llX", ESP.getEfuseMac());
  Serial.println(ssid); //
  String ssid1 = ssid ; // конвертируем из символа в строку
  Serial.println(ssid1);
  int StrLen = ssid1.length();
  Serial.printf("Length of the string %i characters \r\n",StrLen);
  String MAC ="";
  int i = 0; while ( i < 6) {  
    MAC = MAC + ssid1.substring(StrLen-2-2*i,StrLen-2*i)+":";
    i++ ;
  }
  MAC = MAC.substring(0,17); // удаляем последнее:
  Serial.println(MAC);
  String Serialnumber = MCUtype+"-" ;
    int j = 3; while ( j < 6) {  
  Serialnumber = Serialnumber + ssid1.substring(StrLen-2-2*j,StrLen-2*j);
  j++ ;
  }
  Serial.println(Serialnumber);
}

void loop() {
  // поместите сюда свой основной код для многократного запуска:

}
,