ESP-8266/ESP32 NodeMCU Lua: азы программирования.

Тема в разделе "ESP8266, ESP32", создана пользователем ИгорьК, 25 июл 2017.

  1. ИгорьК

    ИгорьК Гуру

    А на простом файле работает? Возьмите какой-нибудь стишок и напечатайте его через вызов по таймеру. Что получится?
     
  2. ИгорьК

    ИгорьК Гуру


    line = "" --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
  3. ИгорьК

    ИгорьК Гуру

    Код (Lua):
    line = ''
    dispatch = coroutine.create(function (sck)
      repeat
        line = file.readline()
        senddata(sck, line)
        coroutine.yield()
      until line
      file.close()
      sck:close()
    end)

    function senddata(sck, data)
      sck:send(data, function(a) coroutine.resume(dispatch) end)
    end

    coroutine.resume(dispatch, sck)
    Но здесь без железа я могу наделать ошибок...
     
    Последнее редактирование: 1 фев 2024
  4. ИгорьК

    ИгорьК Гуру

  5. obuhanoe

    obuhanoe Гик

    без изменений
    без изменений также
    файл создал простой
    Код (Text):
    dfgreqwewrt82d6fg
    bdfhbfghfgjghnm
    dwgb nbfhgh
    dgetrgrh
    создал таймер, но возможно кроме таймера нужно было что-то подправить
    Код (Text):
    tmr.create():alarm(1000*3, tmr.ALARM_AUTO, dispatch)
    также читает только первую строку причем и выводит очень быстро print. Но до этого тоже также выдавал быстро на экран.
     
  6. ИгорьК

    ИгорьК Гуру

    Ну, попробуйте через корутину (если я ошибок не наделал). Мне самому интересно в чем дело, но без железа я не могу помочь.
     
  7. obuhanoe

    obuhanoe Гик

    PANIC: unprotected error in call to Lua API (server.lua:171: attempt to call global 'dispatch' (a thread value))
    с coroutine такая ошибка
     
  8. ИгорьК

    ИгорьК Гуру

    вместо
    dispatch(sck) => coroutine.resume(dispatch, sck)

    и добавьте туда печать прочитанного из файла
     
  9. obuhanoe

    obuhanoe Гик

    Взлетело, что с файлом с явным переносом строк, что в одну строку.
    Только в одну строку он игнорить \n и чатает по 1024 байта и все выводит в print.
    Буду причесывать код, как допилю выложу код.

    Огромное спасибо.
     
    ИгорьК нравится это.
  10. ИгорьК

    ИгорьК Гуру

    Как же интересно, что не получалось без корутины... :) Никогда не приходилось сталкиваться. Казалось, простая вещь.
     
  11. obuhanoe

    obuhanoe Гик

    Вот и мне казалось, а пришлось как далеко зайти, не мог подумать что придется использовать корутины для чтения картинки))))
     
    ИгорьК нравится это.
  12. ИгорьК

    ИгорьК Гуру

    Попробуйте line сделать локальной, сразу под
    Код (Lua):
    dispatch = coroutine.create(function (sck)
      local line = ''
      repeat
    .....
    P.S. И callback и корутину. Корутину сложнее понять, чем использовать :)
     
    Последнее редактирование: 1 фев 2024
  13. obuhanoe

    obuhanoe Гик

    line сделал
    local dispatch = coroutine.create(function (sck) ?

    и еще где?
     
  14. ИгорьК

    ИгорьК Гуру

    не, dispatch - он глобальный.

    Вот о чем речь:
    Код (Lua):
    -- line = ""
    dispatch = coroutine.create(function (sck)
       local line = ''
       repeat
        line = file.readline()
        senddata(sck, line)
     
     
  15. obuhanoe

    obuhanoe Гик

    понял, смутило вот это: P.S. И callback и корутину
    думал что их тоже нужно локальными сделать.
     
  16. obuhanoe

    obuhanoe Гик

    Заметил одну особенность. что при использовании корутины, не срабатывает почему то: connect: on("sent", function()
    Соответственно не закрывается соединение с сервером.

    Код (Lua):
    srv:listen(80, function(connect)
          -- ответ на запрос
          connect:on("receive", receiver)
          --При отправке - закроем соединение
          connect:on("sent", function()    
            connect:close()
            connect = nil    
          end)
        end)
    Проверил старую реализацию, где не было корутины, срабатывает штатно.
     
  17. ИгорьК

    ИгорьК Гуру

    Срабатывает. Дело не в корутине, callback он и равен on("sent",
    Смотрите документацию на работу сокета.
     
  18. obuhanoe

    obuhanoe Гик

    тогда вопрос если срабатывает, почему браузер страницу отобразив (причем корректно), не заканчивает ее подгрузку, кнопка браузере "Обновить" в виде крестика в бесконечной подгрузке. Если я правильно выразился.
    Также добавлял print перед connect:close() - вывода на печать не было.
     
  19. ИгорьК

    ИгорьК Гуру

    Здесь надо смотреть общую логику работы кода и страницы. В любом случае со стороны устройства принудительно закрыть соединение не сложно, а что там делает страница - вам виднее. Здесь я не компетентен
     
  20. ИгорьК

    ИгорьК Гуру

    Если поразмышлять, проблема находится между данными, которыми обмениваются диспетчер и сокет. В диспетчере в этом коде line проверяется на действительность, а не на содержание. Посмотрите внимательнее на них.
    С другой стороны, сокет передаёт в callback какие-то данные, которые вообще не проверяются. Печатайте переменную "а", что в нем.

    Печатайте что приходит для отправки в сокет.

    Накидайте принтов куда можно и наблюдайте.

    Разберитесь и с теми и с другими. Полагаю ситуация прояснится.
     
    obuhanoe нравится это.