Щоб зручно розповсюджувати компільоване програмне забезпчечення, для мікроконтролера ESP8266-12 з прошивкою NodeMCU та мовою Lua, зазвичай:
- в контролер завантажують вихідні lua-файли,
- компілюють їх в оточенні NodeMCU командою
node.compile()
, - а потім отримані двійкові файли типу *.lc, вивантажуть назад у ПК.
І вже потім надсилають готовий набір двійкових файлів колегам чи клієнтам електронними каналами комунікації. Отримавши такі файли, можливо завантажити їх у інший контролер та працювати з ними.
Однією з поширених, спеціалізованих термінальних утиліт є ESPlorer, який у доволі зручний спосіб дозволяє отримати двійкові файли з контролера.
Особливість ESPlorer також полягає у тому, що він дозволяє вивантажувати на ПК файли будь-якого розміру. В той час як, наприклад, Lua Loader, вміє вивантажувати у бік ПК, лише файли розміром до 1024 байт – розмір буфера методу file.read()
, який використовує вбудований в Lua Loader скрипт.
Саме тому, ми у своїй діяльності використовуємо ESPlorer – як один з повсякденних інструментів розробки та дистрибуції коду.
Опис проблеми
Проблема з’явилася неочікувано для нас і полягає у тому, що ESPlorer перестав завершувати процес вивантаження будь-яких файлів у бік ПК, lc-файлів у тому числі.
Проявляється це у вигляді повідомлення та у відсутності діалогу для збереження вивантаженого вмісту з контролера у файл на ПК.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Downloader: Starting... Downloader: Add EventListener: Success. Downloader: Start sending:_dl=function() file.open("display_test.lc", "r") sending: local buf local i=0 local checksum sending: repeat buf = file.read(1024) if buf ~= nil then i = i + 1 checksum = 0 for j=1, string.len(buf) do sending: checksum = checksum + (buf:byte(j)*20)%19 end buf='~~~'..'DATA-START~~~'..buf..'~~~'..'DATA-LENGTH~~~'..string.len(buf)..'~~~'..'DATA-N~~~'..i..'~~~'..'DATA-CRC~~~'..checksum..'~~~'..'DATA-END~~~' sending: uart.write(0,buf) end tmr.wdclr() until(buf == nil) file.close() sending: buf='~~~'..'DATA-TOTAL-START~~~'..i..'~~~'..'DATA-TOTAL-END~~~' sending: uart.write(0,buf) end _dl() _dl=nil Downloader: Receive packet: 1/3, size:1024, CRC check: Success Downloader: Receive packet: 2/3, size:1024, CRC check: Success Downloader: Receive packet: 3/3, size:952, CRC check: Success Operation done. Duration = 3890 ms Waiting answer from ESP - Timeout reached. Command aborted. |
Рис. Помилка завершення вивантаження на ПК, таймаут відповіді від ESP8266 |
Як можна бачити, ESPlorer успішно читає файл з внутрушньої пам’яті мікроконтролера по частинах і успішно завершує читання, але потім, перед самим зберіганням файлу, не може отримати відповіді від ESP8266. І відтак, припиняє всю процедуру вивантаження за крок до її завершення.
Вирішення
Для того, щоб вирішити проблему, ми спробували пошукати хоча б якісь налаштування у ESPlorer і знайшли. Для цього потрібно:
– перейти у закладку Settings панелі Editor, що розташовано ліворуч у ESPlorer
– поставити прапорець “Dumb mode”, never check answers, та встановити час затримки між відповідями, наприклад 500 мілісекунд.
Рис. Налаштування ESPlorer, Група Send, прапорець “Dumb mode” і таймаут |
Відразу після цих маніпуляцій, вивантаження файлів запрацювало:
Рис. Успішне завершення процедури вивантаження файлу у бік ПК |
Причина
Причин може бути багато і різних. Наприклад, з тих пір, як все працювало, встиг вийти новий реліз прошивки NodeMCU. Чи може ця зміна бути причиною багу – перевірити майже неможливо.
Також ми помітили, що якщо до запуску ESPlorer працювали з Lua Loader (а потім коректно вивільнили порт), то цей баг теж себе проявляє. І знову ж, яка причина – складно вгадати. Головне, що ми тепер знаємо, як цей баг обійти.
Бажаємо успіхів!