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的主要内容,如果未能解决你的问题,请参考以下文章