• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Ошибка при прошивке ESP8266

Vascon

New member
Доброго времени суток! Собираю умную розетку с помощью ESP8266 и при прошивке постоянно возникает непонятная ошибка, которую не получилось загуглить:
stdin:1: attempt to call field 'writelinew' (a nil value)

Пытаюсь прошить вот этот код:
Код:
wifi.setmode(wifi.STATION)
wifi.sta.config("vascon_wifi","testpass")
print(wifi.sta.getip())
led1 = 3
led2 = 4
gpio.mode(led1, gpio.OUTPUT)
gpio.mode(led2, gpio.OUTPUT)
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
    conn:on("receive", function(client,request)
        local buf = "";
        local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
        if(method == nil)then
            _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
        end
        local _GET = {}
        if (vars ~= nil)then
            for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
                _GET[k] = v
            end
        end
        buf = buf.."<h1> ESP8266 Web Server</h1>";
        buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF1\"><button>OFF</button></a></p>";
        buf = buf.."<p>GPIO2 <a href=\"?pin=ON2\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF2\"><button>OFF</button></a></p>";
        local _on,_off = "",""
        if(_GET.pin == "ON1")then
              gpio.write(led1, gpio.HIGH);
        elseif(_GET.pin == "OFF1")then
              gpio.write(led1, gpio.LOW);
        elseif(_GET.pin == "ON2")then
              gpio.write(led2, gpio.HIGH);
        elseif(_GET.pin == "OFF2")then
              gpio.write(led2, gpio.LOW);
        end
        client:send(buf);
        client:close();
        collectgarbage();
    end)
end)
Подскажите, пожалуйста, в чём может быть мой косяк?
 

Юрий Ботов

Moderator
Команда форума
Уточни в какой момент это вылетает. Действительно странная ошибка "попытка записать пусто во входной поток данных".
Возможно просто нехватка памяти.
 

Vascon

New member
Уточни в какой момент это вылетает. Действительно странная ошибка "попытка записать пусто во входной поток данных".
Возможно просто нехватка памяти.
Да, вы оказались правы, эта ошибка возникала из-за того, что я не форматировал esp перед загрузкой нового скрипта. Однако теперь у меня возникла другая проблема. При записи скрипта исчезает либо кусок в начале, либо кусок в конце. Выглядит это примерно вот так:

Код:
PORT OPEN 9600

Total : 549941 bytes
Used  : 0 bytes
Remain: 549941 bytes

> file.remove("1.lua");
file.open("1.lua","w+");
w>>  = file.writeline
w([==[wifi.setmode(wifi.STATION)]==]);
w([==[wifi.sta.config("Vascon_WiFi_24","13551369")]==]);
w([==[print(wifi.sta.getip())]==]);
w([==[led1 = 3]==]);
w([==[led2 = 4]==]);
w([==[gpio.mode(led1, gpio.OUTPUT)]==]);
w([==[gpio.mode(led2, gpio.OUTPUT)]==]);
w([==[srv=net.createServer(net.TCP)]==]);
w([==[srv:listen(80,function(conn)]==]);
w([==[    conn:on("receive", function(client,request)]==]);
w([==[        local buf = "";]==]);
w([==[        local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");]==]);
w([==[        if(method == nil)then]==]);
w([==[            _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");]==]);
w([==[        end]==]);
w([==[        local _GET = {}]==]);
w([==[        if (vars ~= nil)then]==]);
w([==[            for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do]==]);
w([==[                _GET[k] = v]==]);
w([==[            end]==]);
w([==[        end]==]);
w([==[        buf = buf.."<h1> ESP8266 Web Server</h1>";]==]);
w([==[        buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF1\"><button>OFF</button></a></p>";]==]);
w([==[        buf = buf.."<p>GPIO2 <a href=\"?pin=ON2\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF2\"><button>OFF</button></a></p>";]==]);
w([==[        local _on,_off = "",""]==]);
w([==[        if(_GET.pin == "ON1")then]==]);
w([==[              gpio.write(led1, gpio.HIGH);]==]);
w([==[        elseif(_GET.pin == "OFF1")then]==]);
w([==[              gpio.write(led1, gpio.LOW);]==]);
w([==[        elseif(_GET.pin == "ON2")then]==]);
w([==[              gpio.write(led2, gpio.HIGH);]==]);
w([==[        elseif(_GET.pin == "OFF2")then]==]);
w([==[              gpio.write(led2, gpio.LOW);]==]);
w([==Є[Кэ@4z
hя)Ующзш

NodeMCU 0.9.5 build 20150318  powered by Lua 5.1.4
lua: cannot open init.lua
> file.remove("1.lua");
file.open("1.lua","w+");
w = file.writelin> 551369")]==]);
w([==[print(wifi.sta.getip())]==]);
w([==[led1 = 3]==]);
w([==[led2 = 4]==]);
w([==[gpio.mode(led1, gpio.OUTPUT)]==]);
w([==[gpio.mode(led2, gpio.OUTPUT)]==]);
w([==[srv=net.createServer(net.TCP)]==]);
w([==[srv:listen(80,function(conn)]==]);
w([==[    conn:on("receive", function(client,request)]==]);
w([==[        local buf = "";]==]);
w([==[        local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");]==]);
w([==[        if(method == nil)then]==]);
w([==[            _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");]==]);
w([==[        end]==]);
w([==[        local _GET = {}]==]);
w([==[        if (vars ~= nil)then]==]);
w([==[            for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do]==]);
w([==[                _GET[k] = v]==]);
w([==[            end]==]);
w([==[        end]==]);
w([==[        buf = buf.."<h1> ESP8266 Web Server</h1>";]==]);
w([==[        buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF1\"><button>OFF</button></a></p>";]==]);
w([==[        buf = buf.."<p>GPIO2 <a href=\"?pin=ON2\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF2\"><button>OFF</button></a></p>";]==]);
w([==[        local _on,_off = "",""]==]);
w([==[        if(_GET.pin == "ON1")then]==]);
w([==[              gpio.write(led1, gpio.HIGH);]==]);
w([==[        elseif(_GET.pin == "OFF1")then]==]);
w([==[              gpio.write(led1, gpio.LOW);]==]);
w([==[        elseif(_GET.pin == "ON2")then]==]);
w([==[              gpio.write(led2, gpio.HIGH);]==]);
w([==[        elseif(_GET.pin == "OFF2")then]==]);
w([==[              gpio.write(led2, gpio.LOW);]==]);
w([==[        end]==]);
w([==[        client:send(buf);]==]);
w([==[        client:close();]==]);
w([==[        collectgarbage();]==]);
w([==[    end)]==]);
w([==[end)]==]);
file.close();
dofile("1.lua");
stdin:1: unexpected symbol near ';'
>
 

Юрий Ботов

Moderator
Команда форума
Похоже на "провал" питания. От чего питаете, и замерьте напряжение питания на флэше ДО/В ПРОЦЕССЕ программирования, не падает ли оно ниже допустимого под нагрузкой
 

Vascon

New member
Похоже на "провал" питания. От чего питаете, и замерьте напряжение питания на флэше ДО/В ПРОЦЕССЕ программирования, не падает ли оно ниже допустимого под нагрузкой
Питание идёт 3.3 вольта от usb-ttl. Замерить напряжение получится только в понедельник. Но раньше с ним точно всё было нормально и с прошивкой проблем не было.
причина - квадратные скобки
А что именно не так с квадратными скобками?
 

Vascon

New member
Похоже на "провал" питания. От чего питаете, и замерьте напряжение питания на флэше ДО/В ПРОЦЕССЕ программирования, не падает ли оно ниже допустимого под нагрузкой
Питание проверил, оказалось всё в порядке. Но на всякий случай реализовал отдельное питание. С ним возникают всё те же проблемы. Но я заметил, что если прошивать несколько раз подряд, то уже на второй раз всё записывается нормально. Но возникают различные ошибки при загрузке скриптов, которых в принципе не должно быть. И при каждой загрузке разные ошибки. Помогите, пожалуйста, советом, от чего такое может происходить?

Вот пример моих попыток загрузить скрипт:
[Lua] PORT OPEN 9600 =node.heap() =node.heap() 21888 > file.remove("script1.lua" - Pastebin.com
(Извиняюсь за ссылку, сюда не влезает больше 10000 символов)
 

nikolz

Well-known member
Доброго времени суток! Собираю умную розетку с помощью ESP8266 и при прошивке постоянно возникает непонятная ошибка, которую не получилось загуглить:
stdin:1: attempt to call field 'writelinew' (a nil value)

Подскажите, пожалуйста, в чём может быть мой косяк?
эта ошибка означает что вызывается функция writelinew а ее нет.
 

Vascon

New member
возможно не хватает места в буфере порта.
Да, я уже понял, что это было из-за того, что я перезаписывал скрипт, не удаляя предыдущий. Но основная проблемы кроется в чём-то другом. Потому что скрипт не загружается целиком. Но даже, когда загружается, возникают непонятные ошибки.
 

nikolz

Well-known member
Да, я уже понял, что это было из-за того, что я перезаписывал скрипт, не удаляя предыдущий. Но основная проблемы кроется в чём-то другом. Потому что скрипт не загружается целиком. Но даже, когда загружается, возникают непонятные ошибки.
А чем вы грузите скрипт?
 

Vascon

New member
Те же самые ошибки возникают с любым другим кодом. Вот, например, попытки записать скрипт для моргания светодиода:
Код:
PORT OPEN 9600
file.remove("blink.lua");
file.open("bli>> nk.lua","w+");
w = file.writeline
w([==[LED_PIN = 1]==]);
w([==[US_TO_MS = 1000]==]);
w([==[]==]);
w([==[gpio.mode(LED_PIN, gpio.OUTPUT)]==]);
w([==[]==]);
w([==[while true do]==]);
w([==[   gpio.write(LED_PIN, gpio.HIGH)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[   gpio.write(LED_PIN, gpio.LOW)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[end]==]);
file.close();
dofile("blink.lua");
stdin:1: unfinished string near '"bli'
>
Total : 549941 bytes
Used  : 0 bytes
Remain: 549941 bytes

> file.remove("blink.lua");
file.open("blink.lua","w+");
w = file.writeline
w([==[LED_PIN = 1]==]);
stdin:1: attempt to call field 'writelinew' (a nil value)
> =[]==]);
w([==[while true do]==]);
w([==[   gpio.write(LED_PIN, gpio.HIGH)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[   gpio.write(LED_PIN, gpio.LOW)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[end]==]);
file.close();
dofile("blink.lua");
stdin:1: unexpected symbol near '['
> file.remove("blink.lua");
file.open("blink.lua","w+");
w = file.writeline
w([==[LED_PIN = 1]==]);
stdin:1: attempt to call field 'writelinew' (a nil value)
> =[]==]);
w([==[gpio.mode(LED_PIN, gpio.OUTPUT)]==]);
w([==[]==]);
w([==[while true do]==]);
w([==[   gpio.write(LED_PIN, gpio.HIGH)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[   gpio.write(LED_PIN, gpio.LOW)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[end]==]);
file.close();
dofile("blink.lua");
stdin:1: unexpected symbol near ')'
> file.remove("blink.lua");
file.open("blink.lua","w+");
w = file.writeline
w(>> [==[LED_PIN = 1]==]);
w([==[US_TO_MS = 1000]==]);
w([==[]==]);
w([==[gpio.mode(LED_PIN, gpio.OUTPUT)]==]);
w([==[]==]);
w([==[while true do]==]);
w([==[   gpio.write(LED_PIN, gpio.HIGH)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[   gpio.write(LED_PIN, gpio.LOW)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[end]==]);
file.close();
dofile("blink.lua");
stdin:2: unexpected symbol near ']'
> file.remove("blink.lua");
file.open("blin>> k.lua","w+");
w = file.writeline
w([==[LED_PIN = 1]==]);
w([==[US_TO_MS = 1000]==]);
w([==[]==]);
w([==[gpio.mode(LED_PIN, gpio.OUTPUT)]==]);
w([==[]==]);
w([==[while true do]==]);
w([==[   gpio.write(LED_PIN, gpio.HIGH)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[   gpio.write(LED_PIN, gpio.LOW)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[end]==]);
file.close();
dofile("blink.lua");
stdin:1: unfinished string near '"blin'
>
Total : 549941 bytes
Used  : 251 bytes
Remain: 549690 bytes

> file.remove("blink.lua");
file.open("blink.lua","w+");
w = file.writeline
w([=stdin:1: invalid long string delimiter near '[='
> =[LED_PIN = 1]==]);
w([==[US_TO_MS = 1000]==]);
w([==[]==]);
w([==[gpio.mode(LED_PIN, gpio.OUTPUT)]==]);
w([==[]==]);
w([==[while true do]==]);
w([==[   gpio.write(LED_PIN, gpio.HIGH)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[   gpio.write(LED_PIN, gpio.LOW)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[end]==]);
file.close();
dofile("blink.lua");
stdin:1: '=' expected near ')'
> file.remove("blink.lua");
file.open("blink.lua","w+");
> ==[LED_PIN = 1]==]);
w([==[US_TO_MS = 1000]==]);
w([==[]==]);
w([==[gpio.mode(LED_PIN, gpio.OUTPUT)]==]);
w([==[]==]);
w([==[while true do]==]);
w([==[   gpio.write(LED_PIN, gpio.HIGH)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[   gpio.write(LED_PIN, gpio.LOW)]==]);
w([==[   tmr.delay(500 * US_TO_MS)]==]);
w([==[end]==]);
file.close();
dofile("blink.lua");
stdin:1: '=' expected near ')'
>
 

Vascon

New member
Распишу, на всякий случай, весь мой процесс загрузки.
- Подключаю ESP через USB-TTL таким образом:

- Прошиваю через NodeMCU Flasher
- Отключаю землю от GPIO0
- Загружаю скрипт через ESPlorer
 

Vascon

New member

nikolz

Well-known member
Нет, я каждый раз вручную удаляю предыдущий скрипт. В логе, который я скидывал выше ([Lua] PORT OPEN 9600 =node.heap() =node.heap() 21888 > file.remove("script1.lua" - Pastebin.com), видно, что перед каждой загрузке использовано 0 байт
свободный heap должен быть 48 кБ а уВас всего 21 - это возможно очень старая прошивка
загрузите новую
 
Сверху Снизу