• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено USART <> WiFi (Lua) (Помогите!)

Serjaru

Member
Нужна помощь от профи в Lua!

Нужен простой функционал USART<>WiFi так сказать просто мост.

Взял следующий пример за основу

Код:
wifi.setmode(wifi.STATION)
wifi.sta.config("SSID", "PASSWORD")

function Success()
    tmr.stop(0)
    if (SERIAL_PRINT) then
        print("IP: " .. wifi.sta.getip())
    end
    wifi.sta.eventMonStop()
    wifi.sta.eventMonReg(wifi.STA_GOTIP, "unreg")
    StartServer()
end

function Failure()
    if (SERIAL_PRINT) then
        print("Unable to connect")
    end
    wifi.sta.eventMonStop()
    wifi.sta.eventMonReg(wifi.STA_GOTIP, "unreg")
    return 0
end

tmr.alarm(0,30000,0, function() Failure() end)
wifi.sta.connect()
sv=net.createServer(net.TCP, 60)
global_c = nil

if (wifi.sta.getip()==nil) then
    wifi.sta.eventMonReg(wifi.STA_GOTIP, function() Success() end)
    wifi.sta.eventMonStart()
else
    StartServer()
end


function StartServer()
    print("Start server")
    uart.setup(0,115200,8,0,1,0)

    sv:listen(80, function(c)
        if global_c~=nil then
            global_c:close()
        end
        global_c=c
        c:on("receive",function(sck,pl)    uart.write(0,pl) end)
    end)

    uart.on("data",0, function(data)
        if global_c~=nil then
            global_c:send(data)
        end
    end, 0)
end
все запускается, работает но!

Когда передаешь строку "Hello World" от WiFi к USART, то все нормально и быстро, но когда обратно USART > Wifi, то доходит только первая буква H

Пробовал менять менять второй параметр (играть с буфером),

Код:
uart.on("data",0, function(data)
то естественно, пока он не накопит нужно кол-во байтов не выдает в сторону WiFi, что плохо.

Вообще нормальнольно можно реализовать такой мост? Lua для меня новый язык и уж слишком высокий (странный), работа с uart как-то нормально реализовывается? в доках там 4-5 методов у этого класса (или как его там)

Может у кого-то есть рабочий пример???

Если у вас работает, то какую версию nodemcu используете?
у меня NodeMCU v1.5.4.1 Lua_5.1.4 (SDK_1.5.4.1)
 

nikolz

Well-known member
это у Вас вся программа. Без таймера и колбека?
Т е разовое исполнение.
------------------
А у Вас WIFI все принимает?
Может быть проблема на передающей стороне?
Поставьте Wireshark и посмотрите пакеты .
--------------------
 

Serjaru

Member
это у Вас вся программа. Без таймера и колбека?
Т е разовое исполнение.
------------------
А у Вас WIFI все принимает?
Может быть проблема на передающей стороне?
Поставьте Wireshark и посмотрите пакеты .
--------------------
Всё, спасибо решил! Нашел более грамотное решение без заморочек с lua!
 

vladimir1

New member
Вот вполне рабочий вариант (nodemcu-firmware/tcp2uart.lua at master · nodemcu/nodemcu-firmware · GitHub)


wifi.setmode(wifi.STATION)
wifi.sta.config("SSID", "PASSWORD")

uart.setup(0,9600,8,0,1,0)
sv=net.createServer(net.TCP, 60)
global_c = nil
sv:listen(9999, function(c)
if global_c~=nil then
global_c:close()
end
global_c=c
c:eek:n("receive",function(sck,pl) uart.write(0,pl) end)
end)

uart.on("data",4, function(data)
if global_c~=nil then
global_c:send(data)
end
end, 0)
 
Сверху Снизу