node??system-level??esp8266??nodeMCU
閑言碎語(yǔ)
nodeMCU的模塊中,有個(gè)特別的模塊籽腕,名叫node嗡呼。看起來(lái)并不像是某種外設(shè)皇耗,但是和其名字有點(diǎn)接近南窗。node模塊看起來(lái)有點(diǎn)特殊。實(shí)際上郎楼,node模塊提供的是一些系統(tǒng)級(jí)(system-level)的API万伤。用來(lái)提供一些特別功能或者獲取一些硬件信息。
模塊函數(shù)
序號(hào) | 函數(shù)名 | 參數(shù) | 返回值 |
---|---|---|---|
1 | node.bootreason() | 空 | rawcode, reason [, exccause, epc1, epc2, epc3, excvaddr, depc ] |
2 | node.chipid() | 空 | chip ID (number) |
3 | node.compile() | filename | 空 |
4 | node.dsleep() | us, option | 空 |
5 | node.flashid() | 空 | flash ID (number) |
6 | node.flashsize() | 空 | flash 大小 (integer) |
7 | node.heap() | 空 | 剩余堆大小 (number) |
8 | node.info() | 空 | majorVer(number), minorVer, devVer, chipid, flashid, flashsize, flashmode, flashspeed |
9 | node.input() | str | 空 |
10 | node.output() | function(str), serial_debug | 空 |
11 | node.restart() | 空 | 空 |
12 | node.restore() | 空 | 空 |
13 | node.setcpufreq() | speed | frequency (number) |
14 | node.stripdebug() | ||
15 | node.osprint() | ||
16 | node.egc.setmode() | ||
17 | node.task.post() |
模塊的最后4個(gè)函數(shù)呜袁,提供了一些高級(jí)功能敌买,反正我是沒(méi)弄懂的。
.chipid阶界、.flashid虹钮、flashsize和.info可以獲取一些設(shè)備信息聋庵。前三個(gè)分別是芯片ID(似乎不是唯一ID,沒(méi)有找到對(duì)此的具體描述)芙粱、flash ID祭玉、flash大小。而最后一個(gè)可以獲取更詳細(xì)的信息春畔,除了前面三種信息脱货,還包括了版本號(hào)、flash的工作模式和速度律姨。
.heap函數(shù)可以獲取當(dāng)前堆的大小振峻。不過(guò),可能因?yàn)樗槠挠绊懺穹荩瑢?shí)際可用空間可能比這個(gè)值小扣孟。
.restore重置系統(tǒng)設(shè)置,看起來(lái)像恢復(fù)出廠值缓淹。具體什么設(shè)置文檔并沒(méi)有說(shuō)到哈打。重置候需要重啟才能使用新配置塔逃。
setcupfreq可以用來(lái)設(shè)置CPU頻率讯壶。有兩種頻率可選
- node.CPU80MHZ
- node.CPU160MHZ
有set函數(shù),卻沒(méi)有g(shù)et函數(shù)湾盗。而info卻沒(méi)有返回CPU頻率伏蚊,好像有點(diǎn)尷尬 o(╯□╰)o
實(shí)踐一下
上面一句話介紹了幾個(gè)函數(shù)的作用。剩下的幾個(gè)函數(shù)不是一句話就能說(shuō)完的格粪,還需要?jiǎng)邮謱?shí)踐一下才知道都有什么用躏吊。
.bootreason函數(shù)可以獲取設(shè)備重啟的原因。通常該函數(shù)返回兩個(gè)值帐萎,都是表示重啟的原因比伏。后者比前者更詳細(xì)的描述了重啟的原因,文檔建議使用第二個(gè)參數(shù)來(lái)獲取重啟的原因疆导。如果是異常重啟赁项,則會(huì)返回更多的值。具體的重啟原因有下面幾個(gè):
- 0, power-on:上電
- 1, hardware watchdog reset:硬件看門狗復(fù)位
- 2, exception reset:異常重啟
- 3, software watchdog reset:軟件看門狗復(fù)位
- 4, software restart:軟件重啟
- 5, wake from deep sleep:設(shè)備喚醒
- 6, external reset:外部重啟
_, reset_reason = node.bootreason()
.restart函數(shù)可以讓設(shè)備重啟澈段,也就是軟重啟悠菜。
在設(shè)備上電后,先使用.bootreason函數(shù)看看返回了什么值败富。接著使用.restart重啟一下設(shè)備悔醋,再使用.bootreason看看這次返回的是什么值。在看一個(gè)尷尬的例子
tmr.alarm(0, 5000, tmr.ALARM_SINGLE, function()
_, reason = node.bootreason()
print("reason : "..reason)
if reason == 6 then
node.restart()
end
end)
這個(gè)例子需要將文件名保存為init.lua兽叮。原本以為上電后芬骄,獲取復(fù)位原因會(huì)是 0 的猾愿,結(jié)果卻返回了6,也就是外部復(fù)位账阻,這就尷尬了匪蟀。另外,我這個(gè)板子上面的reset鍵按了卻一點(diǎn)反應(yīng)都沒(méi)有宰僧。
.compile函數(shù)的作用是將.lua文件編譯成字節(jié)碼材彪。
=node.compile("init.lua")
在右邊的命令行里輸入上面的代碼就可以將lua文件編譯成.lc文件了。然而琴儿,編譯后文件竟然比lua文件大段化。
接著來(lái)看node.dsleep函數(shù),用來(lái)讓設(shè)備進(jìn)入休眠模式的造成。有兩個(gè)參數(shù)显熏,第一個(gè)是睡眠時(shí)間,單位us晒屎。第二個(gè)是關(guān)于RF重啟后的狀態(tài)喘蟆。具體看這里。
tmr.alarm(0, 5000, tmr.ALARM_SINGLE, function()
_, reason = node.bootreason()
print("reason : "..reason)
if reason == 6 then
node.dsleep(1000000)
end
end)
使用睡眠模式鼓鲁,需要將GPIO16和RST連到一起蕴轨。睡眠時(shí)間后將會(huì)拉低RST,使設(shè)備重啟骇吭。這喚醒方式夠暴力的 -_-||
最后來(lái)看兩個(gè)函數(shù)橙弱,.input和.output。.input用于接收一個(gè)lua語(yǔ)句并執(zhí)行燥狰。.output用于重定向輸出執(zhí)行結(jié)果棘脐。官網(wǎng)文檔有個(gè)不錯(cuò)的例子,這里偷懶不自己寫例子龙致,直接搬運(yùn)過(guò)來(lái)蛀缝。不過(guò),官方的s_output函數(shù)沒(méi)有換行目代。
s=net.createServer(net.TCP)
s:listen(2323,function(c)
con_std = c
function s_output(str)
if(con_std~=nil) then
str = str..'\n'
con_std:send(str)
end
end
node.output(s_output, 0) -- re-direct output to function s_ouput.
c:on("receive",function(c,l)
node.input(l) -- works like pcall(loadstring(l)) but support multiple separate line
end)
c:on("disconnection",function(c)
con_std = nil
node.output(nil) -- un-regist the redirect output function, output goes to serial
end)
end)
這個(gè)例子需要連接wifi屈梁,wifi部分內(nèi)容可以看這里。首先是創(chuàng)建一個(gè)server像啼,接著創(chuàng)建一個(gè)監(jiān)聽(tīng)俘闯。重映射了輸出。最后綁定了兩個(gè)事件回調(diào)忽冻。
文檔還中提到真朗,不要使用print(),可能會(huì)出現(xiàn)無(wú)限遞歸僧诚,導(dǎo)致重啟遮婶。
node模塊的內(nèi)容就介紹到這里,后面有機(jī)會(huì)再來(lái)說(shuō)說(shuō)最后兩個(gè)函數(shù)旗扑。用這兩個(gè)函數(shù)和file模塊蹦骑、net模塊、wifi模塊結(jié)合來(lái)實(shí)現(xiàn)一個(gè)類似于esplorer的工具臀防。
更多內(nèi)容
↑ 點(diǎn)擊上面的標(biāo)題可用查看同文集的其它文章眠菇。