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

ESP8266下载和刷固件(基于Lua脚本语言)

唤起文件nodemcu lua 8266

ESA2GJK1DH1K升级篇: 在LUA开发方式下,如何实现http下载LUA文件就可以实现升级Air202和ESP8266的LUA程序

ESP8266 NodeMCU Lua 如何清除堆?

关于esp8266烧写固件后下载Lua代码一直超时的原因

有没有办法在 Nodemcu ESP8266 上的 LUA 中提高 SD 卡写入速度?