关于nodemcu的点点滴滴
讲网络协议之前,我觉得应该把nodemcu的开发过程梳理一遍,再说下自己调试遇到的问题。
- 因为自己也是刚接触lua和esp12,理解上可能会有很多错误,希望各位技术达人多多指正
- 随着调试的深入,我还会继续补充这部份内容
- 大部分链接来自gibhub,版权归原作者所有,阅读文档你可能需要[atom]((https://atom.io/)
首先还是把必须的工具和资料先放上
必备工具和资料
- ESPlorer和入门教程 , 集成了串口调试界面和Lua开发环境的IDE,官方推荐
- 官方lua固件,包含源码,各模块的LUA例程和说明文档,编译后生成bin文件,可以烧写到flash中。
- nodemcu flasher, nodemcu一键烧写工具,无需设置,一键烧写最新的nodemcu固件
- nodemcu硬件资料, nodemcu硬件原理图,gerber文件,管脚说明
- nodemcu的lua应用程序,可以上传至nodemcu运行
- nodemcu API英文文档和中文文档
, 中文文档有错误,但是方便检索 - NodeMCU custom builds,可以在网站上订制自己的nodmcu固件,固件可以只包括需要的模块,减小运行内存。
- 最后还有Lua的官方教程
关于nodemcu固件
在讨论nodemcu的lua固件之前,我想先回顾一下其它开发板的调试过程。
- 对于stm32和TI DSP时,先用仿真器把代码送到内存,运行调试。调试完后再把编译的bin烧写到flash中。
- arduino等单片机没有仿真器,貌似也没有断点debug等断点功能。直接用串口把程序烧到flash,程序从flash送到内存中运行。
- #### nodemcu与arduino一样,都是一根串口线连到flash,串口可以和mcu通信,也可以烧写程序,同样不能断点debug。
对于esp-12的固件
- 我们拿到的esp-12模块可以发送AT指令,因为包含AT指令的固件已经烧进mcu。
- 我们能用lua语言编程程序上传运行,因为包含lua模块和执行器的固件已经烧进mcu
烧写进nodemcu的lua固件更像一个操作系统,它有对应的文件系统SPIFFS
用
ESPlorer
把.lua文件上传至nodemcu的文件系统统SPIFFS,在物理上是把这部代码上传到flash
,放在文件系统对应的地址中。lua固件和文件系统的.lua代码载入内存运行,固件负责解释代码并执行。
上传lua与烧写flash固件的区别是:烧写固件是将原固件擦除并更新,通常不会影响文件系统。而Esplore上传.lua只是更新文件系统。文件系统和固件占用flash的不同地址,互不影响。
要烧写nodemcu的固件,windows下需要VM虚拟系统下的linux编译源码(乐鑫官方的编译方式),或者用安信可的SDK,当然你也可以在网上订制,点击NodeMCU custom builds,你需要烧写工具nodemcu flasher把bin文件写入flash
切记,一旦你烧写nodemcu的固件,意味着你更新了操作系统。它可能增加或减少几个功能模块。而文件系统的
.lua
文件一般情况下会保留。这与重装电脑c盘,d盘的文件不受影响是一个道理。
关于SPIFFS
SPIFFS是nodemcu的文件系统,用于falsh中放置.lua
文件,flash也放置固件。查看nodemcu官方文档对SPIFFS的说明,点击这里,这里简单说一下:
- SPIFFS 全称是SPI Flash File System,用于SPI读写flash的文件系统,其实也可用于NOR flash
- SPIFFS 文件系统用于嵌入式平台的 SPI NOR flash设备,同样适用于MCU内部的falsh
- nodmcu的lua固件包含了SPIFFS文件系统的镜像工具。第一次烧写flash,没有检测到flash中的文件系统,会在flash中新建一个文件系统。文件系统的
起始地址
=固件结束地址
+64K~128K
。 - 如果
新固件大小
<原固件大小
+64K
,原有的文件系统就会保留,否则会新建,原有lua文件丢失
接下来,我们进行实际操作,玩转lua操作系统
step1
这一部分我们学习lua系统的基本操作.
- 你现在已经用usb连上nodemcu,打开esplore。
- 在esplore界面的右上方,刷新,并打开串口,连接nodemcu
- 右侧中心的黑色窗口是串口的回显窗口,显示输入命令和回显
- 右侧下方的窗口条是发送窗口,点击send发送,点send左侧的符号查看发送历史(或者按键盘的下
)
lua是脚本语言,命令逐行被解释并执行,就像matlab和python一样。在发送窗口输入代码,按回车执行(或者按send按钮)
- 你可以定义Numbers变量,进行代数运算,逻辑运算和关系运算, 比如在窗口输入
a=1; b=2; print(a+b); print(a or b); print(a<b)
回显信息
3
1
true
-
c = “You want”; d = ” high a big news!”; print(c..d);
回显信息
You want high a big news!
-
还可以定义更复杂些的table类型, 进行talble construct,比如
list = {1, 2, "You want"};
record = {a=1, b=2, d = " high a big news!"};
list[4] = " high a big news!";
record.c = "You want";
print(list[3]..list[4]);
print(record.c..record["d"]);回显
You want high a big news!
You want high a big news!说明几点
-
table
有list
和record
两种形式 -
list
通常用于数组操作,index默认从1开始,但是可以设置从0开始,比如输入list.[0] = 0
- 调用
record
的元素可以用record.c
或者record["c"]
- 代码注释:第一行和第二行分别创建了
list
和record
,第三行和第四行对其进行操作,追加了元素,第五六两行调用元素并加字符串连接并打印 -
table
结构可以嵌套,构建矩阵二维数组 -
list
和record
可以混编,两种形式之间一般用;
隔开,,
和;
可以互相代替
还有更复杂的statement表达式,包括 if, while, for,等控制结构,以及function都是套路,以后再介绍。大家可以自己点链接查看。
-
到这里,我们可以用nodemcu作为平台,认真学习一下lua
语言了,请参考lua的官方教程
- 码字太累,这一部分先到这里,下一部分说一下lua脚本文件,操作系统中的node模块和file模块。