nodemcu with Lua and 8266 tmr.stop

注意:这是一个问题的副本,请点击这里查看原始问题。

大家好

我完全不了解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)

  -- 做一些事情

  tmr.start(0)
 end)

我收到了一个错误:PANIC: unprotected error in call to Lua API...

文档中说,调用stop时,tmr仍然注册。

调用tmr.state(0)也是一样的。只有tmr.stop(0)才可以按预期工作。

谢谢您的想法。

点赞
用户7396148
用户7396148

根据文档,你需要将 tmr.ALARM_SEMI 作为闹钟模式。

ALARM_SEMI 由 文档 描述为:

tmr.ALARM_SEMI 为手动重复闹钟模式(调用 tmr.start() 重新开始)

tmr.ALARM_SEMI 等同于 2。基于此,下面的代码应该可行:

tmr.alarm(0, 500, 2, function()
      print("我在这里")
      tmr.stop(0)

      -- 完成某些任务

      tmr.start(0)
 end)
2018-12-19 19:02:33
用户131929
用户131929

文档(https://nodemcu.readthedocs.io/en/master/en/modules/tmr)指出不再使用静态计时器。

静态计时器已经被弃用并将在以后被移除。使用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没有被注销和垃圾回收。

2018-12-22 21:30:31