Lua没有足够快地实例化局部变量来打印它?嵌入式ESP8266

Posted

技术标签:

【中文标题】Lua没有足够快地实例化局部变量来打印它?嵌入式ESP8266【英文标题】:Lua not instantiating local variable fast enogh to print it? Embeded ESP8266 【发布时间】:2018-11-19 08:16:08 【问题描述】:

我有一个 EPS8226,我在上面上传了一个 main.lua 文件和一些其他配置。当我在终端中使用dofile() 运行main.lua 时,回调函数中的print 仅打印“sensorId”而没有“sent 0”。然而,如果我再次运行main.lua,或者我之前运行print() 某些东西(在调用回调的function() 内部,或者在回调本身内部),它将正确打印“sensorId sent 0”。如果我不使用 local 变量,这也有效。

function registerReaders()
  for key, value in pairs(sensorConfig.data)
  do
    gpio.mode(value.pin, gpio.INPUT)
    value.timer:alarm(value.polling, tmr.ALARM_AUTO, function() callbacks.sendData(sensorConfig.sensorId[key]) end)
    tmr.create():alarm(1000, tmr.ALARM_SINGLE, function() callbacks.sendData(sensorConfig.sensorId[key]) end)
  end
end

打印“[sensorId_value]”

callbacks.sendData = function(sensorId)
  local data = 1
  print(sensorId .. " sent " .. data)
end

打印正确(“OK”然后“[sensorId_value] 发送 0”)

 callbacks.sendData = function(sensorId)
      local data = 1
      print("OK")
      print(sensorId .. " sent " .. data)
    end

打印正确(“[sensorId_value] sent 1”)

callbacks.sendData = function(sensorId)
          print(sensorId .. " sent 0")
        end

【问题讨论】:

您使用的是什么版本的 Lua 固件?最新的主版本是 2.2 【参考方案1】:

在所有示例中,sensorId 都是变量,而不是字符串,因此除非 sensorId = "sensorId",否则它们都不应该打印“sensorId sent 0”。

在第一个例子中(实际上都是)“send”是一个文字,它应该输出而不考虑数据的值。

第二个示例不应该打印“[...] sent 1”吗?

尝试使用数据以外的变量名,可能会有一些前向值混淆。

【讨论】:

你说得对,我更正了问题以消除混淆。没有打印文字“已发送”似乎很奇怪,但这就是发生的事情。 一击计时器将几乎同时触发,虽然每个注册都有自己的匿名回调函数实例,但只有一个 callbacks.sendData 实例,也许它正在重新输入?每次调用都会创建一个局部变量数据的新实例。异常:没有调用 timer:start,回调是如何执行的?将参数传递给回调,但未声明任何参数。您正在迭代 sensorConfig.data,如何将 key 索引放入 sensorConfig.sensorId? tmr.create():register 自动启动计时器并将其设置为在 1000 毫秒内触发。只有在 sensorConfig.data 中的一项时才会出现此错误。 如果你这么说,但根据文档 :start 必须被调用。我一直用 tmr.alarm 代替,所以不能说。我还通过他们的 ID 管理计时器——你知道只有 6 个计时器可用于用户代码,对吗? 我的错,我写了代码而不是复制粘贴。是的,这是警报。

以上是关于Lua没有足够快地实例化局部变量来打印它?嵌入式ESP8266的主要内容,如果未能解决你的问题,请参考以下文章

无法实例化 ColDef 变量

为什么局部变量没有在Java中初始化?

lua特性纪要

使用Lua 局部变量来优化性能,同一时候比較局部变量和全局变量

如何在lua中正确定义局部变量并将其引用到XML?

java中静态成员变量、实例变量、局部变量何时创建、何时销毁?