问题描述
我正在为 Nodemcu (esp8266) Lua 编写一个函数来从 UART 构建命令字符串(有人输入)。当它完成字符捕获时,它应该将字符串返回给调用函数,但调用函数只得到 nil。我是 Lua 新手,我错过了什么?
local function getcmd()
local t = { }
local cmd
-- Callback function
uart.on("data",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
解决方法
感谢@EgorSkriptunoff 帮助我了解正在发生的事情。
以下是有效的代码(到目前为止)。我尝试的是在 getcmd() 内的事件处理程序周围的 While 循环。这将失败,因为它停止了所有后台事件的执行,这些事件保持 wifi 和其他保持 ESP8266 运行的基本功能,因此它反复崩溃/重启。
我所做的不是从 getcmd() 返回而是直接调用 config() 并将我在事件处理程序中收集的输入传递给它,如下所示:config(cmd)
潜在的问题是,事件处理程序仍在运行,因为它从未到达终点,如果我在调用另一个函数之前没有从 config() 返回,这可能会导致一些堆栈/内存问题。
无论如何,这是目前有效的代码:
function getcmd()
local t = { }
cmd=nil
uart.on("data",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,"\r\n"..#t.."\r\n")
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