唤起文件nodemcu lua 8266
Posted
技术标签:
【中文标题】唤起文件nodemcu lua 8266【英文标题】:evoking files nodemcu lua 8266 【发布时间】:2019-05-21 13:27:48 【问题描述】:我正在尝试了解 dofile() 在 lua 中的使用。 将其放入 init.lua 是一种很好的做法 归档一行包含函数声明、wifi 初始化等的其他文件? init.lua:
dofile("InitWifi.lua")
dofile(helperfunctions.lua")
dofile(...) dofile(..)
tmr.alarm(0,3000, function()
runprogram()
end)
这将大大减少要测试的程序的下载时间。
dofile(xyx.lua)的效果和xyz.lua一样吗 代码包含在“myprogram.lua”文件中?
【问题讨论】:
(简答:是)您可以在不同的文件中编写程序的不同部分。所有这些部分共享同一组全局变量。但每个部分都有自己孤立的局部和升值。 我们的常见问题解答中有大量信息,特别是nodemcu.readthedocs.io/en/master/en/lua-developer-faq/…。我们还在nodemcu.readthedocs.io/en/master/en/upload/#initlua 上发布了一个经过一定程度改进的init.lua
模板示例。 Nifim 的回答很好。
NodeMCU Lua 模块的例子请看github.com/nodemcu/nodemcu-firmware/tree/master/lua_modules中的贡献
【参考方案1】:
处理此主题的另一种方法是使用require
函数。
require 的操作与 dofile 类似,因为它执行 Lua 文件,但它还内置了更多智能。
Lua require
加载给定的模块。该函数首先查看 package.loaded 表以确定 modname 是否已加载。如果是,则 require 返回存储在 package.loaded[modname] 中的值。否则,它会尝试为模块查找加载器。
require
是加载模块的常见做法,模块就像一个库。
将文件设置为模块的一个好处是,您可以通过在模块内定义范围来避免覆盖另一个文件中的函数。
模块foo.lua
的示例代码:
local foo
function foo.bar(a)
local a = x + 7
print(a)
end
-- More functions defined inside the foo table
-- ...
return foo
在模块中使用 require 的示例:
local f = require("foo")
f.bar(7)
【讨论】:
非常感谢大家!我将不得不研究“要求”声明。我还不太了解 dofile 与 require 的区别【参考方案2】:init.lua 的一般做法是在一小段测试时间后执行主 Lua 文件。
countdown = 5
tmr.alarm(0,2000,1,function()
if APPLICATION_REPROGRAM == nil then
print("coutdown : "..countdown)
countdown = countdown-1
if countdown<1 then
tmr.stop(0)
countdown = nil
local s,err
if file.open("main.lua") then
file.close()
s,err = pcall(function() dofile("main.lua") end)
end
if not s then print(err) end
end
end
end)
如果您需要在 main.lua 执行之前将更多变量和函数添加到全局环境中,您可以简单地在 main.lua 中使用 require 添加它们
local initWifi = require 'InitWifi.lua'
它将与 dofile() 执行相同的操作,但具有更多控制和错误处理。
你也可以使用main.lua里面的initWifi.lua中的函数:
initWifi.helperFunct(param1)
【讨论】:
以上是关于唤起文件nodemcu lua 8266的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 Nodemcu ESP8266 上的 LUA 中提高 SD 卡写入速度?