Ввести идентификатор чипа 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). Я уверен, что этот код может быть написан гораздо более приятным и чистым способом, но сейчас мне это нужно, чтобы перейти к другому фрагменту (который зависит от имени устройства в вышеупомянутом формате). Может ли кто-нибудь предоставить некоторые указания, пока я попытаюсь проверить различные способы, которыми я мог бы этого достичь? Я просто хочу быть уверенным, что я не пишу некрасиво (и опасный код - сбои, переполнение буфера и т.д.). Очень ценю любые указатели. Наверное, я начинаю немного параноидально относиться к обработке строк ( особенно на устройствах с низким объемом памяти, таких как обычные микроконтроллеры ).
@R.W, 👍4
Обсуждение3 ответа
Лучший ответ:
Вы можете объединить всю свою работу в одну строку с помощью snprintf. Вы не ограничены только одной переменной, и вы можете добавить обычный текст:
char ssid[23];
snprintf(ssid, 23, "MCUDEVICE-%04X%08X", chip, (uint32_t)chipid);
Почему бы вам просто не использовать:
snprintf(ssid, 23, "MCUDEVICE-%llX", ESP.getEfuseMac());
Таким образом, нет необходимости в битовом сдвиге и дополнительных средних переменных...
Просто обратите внимание на заглавную букву X для заглавного результата и маленькую букву "l" для указания типа. (имеется в виду использовать либо llX, либо llx, а не LLX).
Это работает на 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() {
// поместите сюда свой основной код для многократного запуска:
}
- C++ против языка Arduino?
- ошибка: ожидаемое первичное выражение перед токеном ','
- Передача функции-члена класса в качестве аргумента
- Улучшенное циклическое переключение цветов RGB.
- Какие есть другие IDE для Arduino?
- Несовместимые типы при назначении «uint8_t {aka unsigned char}» на «uint8_t [1] {aka unsigned char [1]}»
- Как преобразовать массив символов в строку в arduino?
- Каково отношение файла Arduino .ino к main.cpp?
Какова цель следующей строки: uint16_t чип = (uint16_t)(идентификатор чипа >>> 32); ? Спасибо, @Itamar Vieira
@ItamarVieira это копирует самые высокие 16 бит из “chipid” (который является 48-разрядным значением в 64-разрядной переменной) в переменную “chip” (которая является 16-разрядной переменной)., @StarCat