带有 Lua 和 8266 tmr.stop 的 nodemcu
Posted
技术标签:
【中文标题】带有 Lua 和 8266 tmr.stop 的 nodemcu【英文标题】:nodemcu with Lua and 8266 tmr.stop 【发布时间】:2019-05-18 10:14:43 【问题描述】:注意:这是here提出的问题的副本
嗨
我对 EPS8266 和 Lua 完全陌生(但对编程不熟悉 - 我的第一个 CPU 是 8080...) 使用来自 adafruit 的 nodemcu HUZZA
无论如何,我正在测试一些计时器的东西并遇到了这个问题:
tmr.alarm(0, 500, 1, function()
print("I'm here")
tmr.stop(0)
end)
没有停止,循环继续打印,tmr.stop(0)
停止。 ...到目前为止一切顺利。
但如果我想再次启动计时器:
tmr.alarm(0, 500, 1, function()
print("I'm here")
tmr.stop(0)
-- do some stuff
tmr.start(0)
end)
我收到一个错误:PANIC: unprotected error in call to Lua API...
文档说tmr
在调用stop
时仍然被注册。
对tmr.state(0)
的调用也是如此。只有tmr.stop(0)
似乎按预期工作。
感谢您的意见。
【问题讨论】:
可能tmr.start
不允许在定时器回调函数中使用?
@I0sens 此处需要进一步输入吗?
【参考方案1】:
The documentation 表示不再使用静态计时器
静态计时器已弃用,稍后将被删除。使用
tmr.create()
发起的OO API。
如果您想完全控制计时器回调中的函数何时执行,您需要一个ALARM_SEMI
实例,您可以在需要时调用start
。每次调用 start
时,它都会触发一次。
local mytimer = tmr.create()
mytimer:register(500, tmr.ALARM_SEMI, function() print("I'm here") end)
-- do stuff here
-- then whenever needed trigger the timer
mytimer:start()
请注意,mytimer
没有取消注册,也没有被垃圾回收。
【讨论】:
【参考方案2】:根据文档,您需要使用 tmr.ALARM_SEMI 作为您的警报模式。
ALARM_SEMI 由documentation 描述为:
tmr.ALARM_SEMI 手动重复报警(调用 tmr.start() 到 重启)
tmr.ALARM_SEMI is equal to 2。基于此,这应该有效:
tmr.alarm(0, 500, 2, function()
print("I'm here")
tmr.stop(0)
-- do some stuff
tmr.start(0)
end)
【讨论】:
如果您甚至需要在 alarm_semi 上调用 stop,文档还不清楚,我怀疑您不需要。 嗨,Nifim,谢谢 这听起来很合理——我会在周末试试这个。尽管文档没有说明您不能在 tmr.ALARM_AUTO 警报上使用 tmr.start。以上是关于带有 Lua 和 8266 tmr.stop 的 nodemcu的主要内容,如果未能解决你的问题,请参考以下文章
ESA2GJK1DH1K升级篇: 在LUA开发方式下,如何实现http下载LUA文件就可以实现升级Air202和ESP8266的LUA程序