Вечер вторника: вчера всё работало, сегодня я нажимаю «Загрузить» и получаю красное «avrdude: stk500_recv(): programmer is not responding». Код я не менял — значит, поменялось что-то вокруг кода. Но первым делом я полез переустанавливать Arduino IDE, потратил на это полчаса, получил ту же ошибку и только потом заметил, что в трее висит окно Serial-монитора из вчерашней сессии — и именно оно держало порт. Этот урок про такие вечера: что происходит между кнопкой «Загрузить» и платой, что на человеческом языке говорит avrdude и как за пять минут пройти от ошибки до прошивки, не переустанавливая ничего.
Сначала — разделение работ, без которого вся диагностика разваливается. Если красное слово появилось после зелёной галочки компиляции, ваш код ни при чём: этап перевода текста в машинный код прошёл, сломалась фаза доставки прошивки в чип. Это разные миры с разными виновниками: код и компилятор мы разбирали в уроке про чтение лога, а механику заливки — что делает среда в пятнадцать секунд после нажатия стрелки — в уроке про загрузку скетча. Здесь только второй мир: связь, порт, загрузчик.
Словарь avrdude: о чём он на самом деле сообщает
avrdude — утилита, которую среда запускает для заливки, и её сообщения стоит читать как бланки. ser_open(): can't open device: Access is denied (в Linux — Permission denied) — порт физически открыть не удалось: его уже занял кто-то другой. Кандидаты по частоте: Serial-монитор в классической 1.8.x, который не умеет отпускать порт сам, вторая копия IDE, терминальные утилиты и слайсеры. Лечение — закрыть захватчика и повторить загрузку; в IDE 2 монитор отпускает порт обычно сам, но сторонние программы — никогда. На Linux тот же текст при отсутствии прав лечится добавлением пользователя в группу dialout, у нас этому посвящён отдельный урок — не тратьте вечер на переустановку драйверов, если дело в группе.
stk500_getsync() attempt 1 of 10: not in sync resp=0x00 — порт открылся, но плата молчит: десять попыток синхронизации, ноль ответа. Значение resp подсказывает характер тишины: 0x00 — ответа нет вообще, то есть кабель без проводов данных, мёртвый порт, драйвер или не тот порт в меню. stk500_recv(): programmer is not responding — родное сообщение того же семейства: связь оборвалась или не началась. И заметьте: у всех этих ошибок виновник не «программа в чипе», а дорога к ней — провод, порт, драйвер, выбор в меню.
Отдельный сорт тишины — когда плата отвечает, но не тем голосом. Так живёт классика китайских Nano: old bootloader. Старый загрузчик общается на скорости 57600 бод, новый — на 115200, и если в меню «Инструменты → Процессор» выбран не тот пункт, среда стучится на одной скорости, а загрузчик слушает на другой: получите not in sync или stk500_recv при абсолютно живой дороге. Лечение — десять секунд в меню: сменить процессор на ATmega328P (Old Bootloader) и повторить. Я после первой такой истории пробую оба пункта процессора раньше, чем лезу в кабели: две загрузки по десять секунд дешевле любого тестера.
Окно загрузчика: секунда, в которую надо успеть
Почему вообще возможна ошибка not in sync? Потому что загрузчик не слушает порт вечно. При старте среда дёргает линию DTR, плата делает reset, и загрузчик — маленькая программа, живущая в конце flash-памяти, — открывает окно приёма: на Uno с Optiboot это около секунды на скорости 115200 бод. Успел avrdude за окно — прошивка уходит, огоньки TX и RX бегут, через пару секунд работает новый скетч. Не успел или стучался не в тот порт — окно закрывается, старый скетч продолжает работать, а вы смотрите на stk500_recv. Никакой мистики: у связи с загрузчиком есть срок, и он измеряется секундами.
Из этого окна растут два практических приёма. Первый — ручной reset для капризных плат и для скетчей-спамеров: если ваша программа заваливает Serial выводом или крутит тяжёлый цикл, иногда она мешает входу в загрузчик; нажмите Reset на плате и сразу после — «Загрузить», плата снова откроет окно и будет ждать прошивку. Второй — повторная загрузка без передышки: даже после неудачной попытки среда передёргивает reset, так что просто нажать «Загрузить» второй раз — легальный ход, а не костыль. Оба приёма хорошо видны в симуляторе ниже: кнопка в макетке изображает Reset на плате, и вы своими глазами следите за окном.
Если же лесенка пройдена целиком — порт верный, монитор закрыт, процессор выбран правильно, кабель с данными, драйвер стоит, как мы ставили в уроке про CH340, — а плата всё молчит, остаётся худший сценарий: загрузчик повреждён. Такое случается после неудачной прошивки чужой платы или перепайки, и лечится это не меню, а программатором — USBasp или второй Arduino с прошивкой Arduino as ISP. Это редкость в первый год, но знать о ней стоит: теперь вы знаете, что не всё лечится передёргиванием кабеля, и где кончается территория меню.
| Симптом в логе | Вероятная причина | Лечение |
|---|---|---|
| ser_open(): Access is denied | Порт занят монитором или другой программой | Закрыть захватчика; в Linux — группа dialout |
| not in sync resp=0x00 | Тишина: кабель без данных, не тот порт, драйвер | Передёрнуть кабель, сверить порт, вспомнить про CH340 |
| stk500_recv(): programmer is not responding | Плата не отвечает в окно загрузчика | Повторить загрузку; ручной Reset; проверить плату и процессор |
| Nano не грузится ни в какую | Старый загрузчик на скорости 57600 | Инструменты → Процессор → ATmega328P (Old Bootloader) |
| expected signature for ATmega2560 | Выбрана не та плата | Выбрать правильную плату — сигнатура защищает чужой чип |
- Передёрните USB-кабель и откройте «Инструменты → Порт»: ваш порт вообще в списке?
- Закройте Serial-монитор и другие программы, умеющие открывать COM-порты.
- Сверьте плату и процессор в меню: для клонов Nano попробуйте оба пункта, старый загрузчик — первый подозреваемый.
- Возьмите другой кабель — заведомо с передачей данных — и другой USB-гнездо компьютера, минуя хабы.
- Нажмите Reset на плате и сразу «Загрузить»: окно загрузчика откроется заново.
- Сверьте драйвер USB-чипа в Диспетчере устройств: плата должна появляться как USB-SERIAL CH340 или аналог.
- Только после всего этого думайте про повреждённый загрузчик и программатор.
// Грузится — дорога жива, ищите проблему в прошлом скетче.// Не грузится даже этот — вернитесь к лесенке диагностики.void setup() { pinMode(13, OUTPUT); Serial.begin(9600);} void loop() { digitalWrite(13, HIGH); Serial.println("zhiv"); delay(2000); digitalWrite(13, LOW); delay(2000);}Моё мнение с границей: лесенку целиком я прохожу один-два раза в год, когда встречаю новую для себя плату или чужой компьютер. В обычный вечер хватает первых трёх ступеней — кабель, монитор, порт, — и это не лень, а статистика: подавляющее большинство stk500_recv лечится до четвёртой ступени. Но лесенку стоит знать наизусть именно потому, что в момент ошибки теряется логика: красный текст как будто кричит, что сломалось всё сразу, а на деле не отвечала одна дорога из семи звеньев. Разбиение на звенья — кабель, порт, драйвер, плата, процессор, загрузчик — превращает панику в чек-лист, с которым вы идёте сверху вниз, а не прыгаете к переустановке Windows, как делал я.
И последнее: плата, которая вчера грузилась, а сегодня молчит, почти всегда даст понять себя до всякой лесенки — светодиод ON на ней горит, старый скетч работает. Если и светодиод мёртв, начните вообще с питания и кабеля — это уже территория урока про первое подключение Uno и урока про невидимый порт. А когда прошивка наконец уходит и огоньки TX/RX пробегают свой забег — плате можно доверять дальше: следующим шагом будет Serial-диалог с ней, с которого начинается монитор порта.
- Красное слово после зелёной компиляции — вина связи, а не кода: код и дорога к чипу — разные этапы
- ser_open: Access is denied — порт занят (монитор 1.8.x, вторая копия IDE); в Linux — группа dialout
- not in sync resp=0x00 — тишина на дороге: кабель, порт, драйвер; у Nano сначала пробуйте Old Bootloader (57600)
- Окно загрузчика живёт около секунды после reset: не успел avrdude — stk500_recv; лечится повтором или ручным Reset
- Лесенка: кабель → монитор → порт → процессор → другой кабель → драйвер → программатор; дешевле шаг — раньше в очереди
- 1. «Проверить» проходит зелёным, «Загрузить» падает со stk500_recv. Что чинить?
- 2. avrdude пишет ser_open(): can't open device: Access is denied. Кто вероятный виновник?
- 3. Клон Nano упорно молчит при загрузке. Какой пункт меню проверить первым?
- 4. Что означает not in sync resp=0x00?
- 5. Как долго загрузчик Uno ждёт прошивку после reset?
Частые вопросы по теме урока
- «Проверить» проходит зелёным, «Загрузить» падает со stk500_recv. Что чинить?
- Компиляция прошла — код в порядке. Ошибка avrdude живёт на этапе связи: порт, монитор, кабель, плата, процессор, загрузчик. Дорогу до платы: порт, кабель, драйвер, выбор в меню
- avrdude пишет ser_open(): can't open device: Access is denied. Кто вероятный виновник?
- Отказ в доступе при открытии порта почти всегда означает захват: монитор классической IDE, терминал, вторая копия среды. Закройте захватчика. В Linux проверьте группу dialout. Порт занят Serial-монитором или другой программой
- Клон Nano упорно молчит при загрузке. Какой пункт меню проверить первым?
- Старый загрузчик Nano слушает 57600 бод, новый — 115200. Несовпадение скорости даёт not in sync при полностью исправной дороге. Смена пункта — десять секунд. Инструменты → Процессор: ATmega328P (Old Bootloader) вместо ATmega328P
- Что означает not in sync resp=0x00?
- Нулевой ответ — ноль байт в ответ: кабель без проводов данных, мёртвый порт, не тот порт в меню или драйвер. Плата не услышала ни одного вопроса. Ответа нет вообще: тишина на проводе
- Как долго загрузчик Uno ждёт прошивку после reset?
- Optiboot на Uno открывает окно приёма примерно на секунду после ресета. Не успели — окно закрылось и работает старый скетч. Именно поэтому повторная загрузка и ручной Reset так эффективны. Около секунды, потом передаёт управление старому скетчу