带有Lua和8266 tmr.stop的nodemcu

时间:2018-12-18 02:15:00

标签: lua esp8266 nodemcu

注意:这是一个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)似乎可以正常工作。

感谢您的想法。

2 个答案:

答案 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)