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

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

local function getcmd()

  local t = { }
  local cmd

  -- 回调函数
  uart.on("data", 0, function(data)

    if data~='\r' then
      -- 回显输入
      t[#t+1] = data
      uart.write(0,t[#t])

      -- BACKSPACE/DEL
      if t[#t] == '' then
        t[#t] = nil
        t[#t] = nil
      end

      -- 此处还需要处理 <TAB>

    else
      -- 禁用回调
      --uart.on("data")

      -- 打印表格,转换为字符串。
      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, "在返回之前> "..cmd)
        -- type() String
        return cmd
      end
    end
  end,0)
end

local function config()

  local cmdstr

  -- 测试
  cmdstr = getcmd()
  print("func() "..getcmd())

  if cmdstr ~= nil then
    uart.write(0, cmdstr.."> ")
  end
end
点赞
用户870223
用户870223

感谢 @EgorSkriptunoff 帮助我理解正在发生的事情。

以下是到目前为止有效的代码。我尝试将While循环放在getcmd()函数的事件处理程序周围,但这会停止执行所有背景事件,这些事件保持wifi和其他保持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,"\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")

  -- 现在解析cmd并返回。
end
2021-03-13 02:13:48