注意:这是一个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)
似乎可以正常工作。
感谢您的想法。
答案 0 :(得分: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
尚未取消注册,也没有垃圾回收。
答案 1 :(得分:0)
根据文档,您需要使用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)