Lua函数返回字符串,但调用函数得到nil



我正在为Nodemcu(esp8266(Lua编写一个函数,用于从UART(有人在键入(构建命令字符串。当它完成捕获字符时,它应该将字符串返回给调用函数,但调用函数只得到nil。我是卢的新手,我缺少什么?

local function getcmd()
local t = { }
local cmd

-- Callback function
uart.on("data", 0, function(data)

if data~='r' then
--Echo input
t[#t+1] = data
uart.write(0,t[#t])
-- BACKSPACE/DEL
if t[#t] == '' then
t[#t] = nil
t[#t] = nil
end
-- NEED <TAB> handling here too
else
--Disables callback
--uart.on("data")
-- Print table, convert to string.
for i = 1, #t do
uart.write(0, t[i])
if i==1 then
cmd = tostring(t[i])
else
cmd = cmd .. tostring(t[i])
end
end
t = { }
if cmd ~= nil then
uart.write(0, "Before Return> "..cmd)
-- type() String
return cmd
end
end
end,0)
end
local function config()
local cmdstr
-- Testing
cmdstr = getcmd()
print("func() "..getcmd())
if cmdstr ~= nil then
uart.write(0, cmdstr.."> ")
end
end

感谢@EgorSkcriptunoff帮助我了解发生了什么。

以下是(到目前为止(有效的代码。我所尝试的是在getcmd((内部围绕事件处理程序进行While循环。这之所以失败,是因为它停止了所有后台事件的执行,这些事件保持了无线网络和其他保持ESP8266运行的基本功能,因此它会反复崩溃/重新启动。

我没有从getcmd((返回而是直接调用config((,并将我在事件处理程序中收集的输入传递给它,如下所示:config(cmd(

潜在的问题是,事件处理程序仍在运行,因为它从未到达终点,如果我在调用另一个函数之前不从config((返回,这可能会导致一些堆栈/内存问题。

不管怎样,这是目前有效的代码:

function getcmd()
local t = { }
cmd=nil
uart.on("data", 0, function(data)

if data~='r' then
--Echo input
t[#t+1] = data
uart.write(0,t[#t])

-- BACKSPACE/DEL
if t[#t] == 'BS' then
t[#t] = nil
t[#t] = nil
end
else
--uart.on("data")

if #t ~= nil then
uart.write(0,"rn"..#t.."rn")
end

for i = 1, #t do
uart.write(0, t[i])
if i==1 then
cmd = tostring(t[i])
else
cmd = cmd .. tostring(t[i])
end
end
t = { }
if cmd ~= nil then
-- Calling config() here doesn't allow event handler on.uart() to end.
config(cmd)
end
end
end,0)
end
------------------------------------------------------
function config(cmd)
print("r<<"..cmd..">>r")

-- Now parse cmd and return.
end

最新更新