• Система автоматизации с открытым исходным кодом на базе 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 - это возможно очень старая прошивка
загрузите новую
 
Сверху Снизу