Блог
Ошибки кода ESP32: преобразования, компиляция
Ошибки преобразования, паника и скетчи, которые компилируются, но врут, — текст ошибок ESP32 краток, но каждое сообщение указывает на конкретную починку. Что означают частые ошибки и что менять первым делом.
Не могу преобразовать bytearray в int на ESP32?
В MicroPython функция, которую вы ищете, — int.from_bytes(bytes, «little»): bytearray — это итератор по байтам, а не число. В C та же форма ошибки означает, что вы присваиваете массив uint8_t переменной int; скопируйте значение отдельно. Поищите «can’t convert bytearray to int esp32» — половина тем это разбор UART в MicroPython, вторая половина — чтение структур в C. Вставьте падающий скетч в симуляторный MCP — он воспроизведёт ошибку за вас.
Что значит «Guru Meditation Error»?
Это заголовок паники: чип поймал исключение, напечатал backtrace и сбросился. Текст после него, например «core 1 panic» плюс адрес, говорит, где. Строки backtrace — это функции, которые выполнялись; читайте снизу вверх, потому что паника срабатывает в последней вызванной функции.
Как расшифровать backtrace?
Вставьте адреса в addr2line или дайте инструменту сделать это самому: idf.py monitor расшифровывает автоматически, и PlatformIO тоже. Разрешённая строка вроде 0x400d1234: loop() at sketch.ino:42 называет точное место. В Arduino IDE расшифровывать придётся руками.
Почему ESP32 перезагружается по кругу?
Прочитайте последний вывод serial — чип каждый раз печатает, от чего умер. Цикл перезагрузок — это паника, brownout или сброс по сторожевому таймеру, и сообщение скажет, что именно. Brownout лечится нормальным питанием; watchdog — задачей, которая отдаёт управление. FAQ по отладке разводит три случая по симптомам.
Что такое «exit status 1»?
Это универсальная обёртка Arduino для неудачной сборки — настоящая ошибка сидит на несколько строк выше, обычно в первой строке с «error:». Почините первую ошибку, и каскад обычно рассасывается. «exit status 1» сам по себе никогда не является проблемой; это сводка. Если ошибка указывает на заголовок, который вы не трогали, — обновите библиотеку.
Почему после чтения датчика число всегда ноль?
Три классические причины: целочисленное деление (в C 5/2 равно 2), чтение АЦП до того, как он устаканился, и текст из serial, приходящий как «42n», который atoi() читает неправильно. Сначала напечатайте сырое значение — за десять секунд станет ясно, какой из случаев ваш. В прошлом месяце я сжёг час на этом с DHT22.
Почему toInt() возвращает 0 при корректных данных?
toInt() молчит об ошибке — мусор на входе, ноль на выходе, без сообщений. Проверьте строку через isDigit() или сначала обрежьте пробелы: перенос строки в конце ломает её чаще всего. То же относится к atoi() в C: проверяйте строку, прежде чем доверять числу.
Что такое переполнение стека на ESP32?
Это канарейка: чип обнаруживает порчу стека и паникует со словом «stack canary» в трейсе. Обычный источник — глубокая рекурсия и большие локальные массивы; перенесите буферы в static или кучу и поднимите размер стека в xTaskCreate. FAQ о внутренностях показывает раскладку памяти, которая объясняет, почему.
Ошибка компиляции и ошибка линковки — в чём разница?
Ошибки компиляции живут внутри одного файла: синтаксис, типы, необъявленные имена. Ошибки линковки — это недостающие куски: «undefined reference to» значит, что функции не существует нигде или библиотека не подключена. Первое слово в строке ошибки говорит о фазе, а фаза — о том, где искать.
Почему ошибка указывает на строку, которая выглядит нормальной?
Компилятор сообщает, где заметил, а не где началось — обычно это пропущенная скобка или точка с запятой на несколько строк выше. Идите назад от отмеченной строки и включите подробный вывод IDE, чтобы увидеть всю цепочку.
Проекты по этой теме запускаются прямо в бесплатном симуляторе sensbench: схема уже собрана, прошивка включена — без аккаунта и установки.