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

问题描述

我正在为 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