NODEMCU调试心得3 - 关于nodemcu的点点滴滴

时间:2021-05-21 13:42:55

关于nodemcu的点点滴滴

讲网络协议之前,我觉得应该把nodemcu的开发过程梳理一遍,再说下自己调试遇到的问题。

  • 因为自己也是刚接触lua和esp12,理解上可能会有很多错误,希望各位技术达人多多指正
  • 随着调试的深入,我还会继续补充这部份内容
  • 大部分链接来自gibhub,版权归原作者所有,阅读文档你可能需要[atom]((https://atom.io/)

首先还是把必须的工具和资料先放上

必备工具和资料

关于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

NODEMCU调试心得3 - 关于nodemcu的点点滴滴
- 右侧中心的黑色窗口是串口的回显窗口,显示输入命令和回显
- 右侧下方的窗口条是发送窗口,点击send发送,点send左侧的符号查看发送历史(或者按键盘的

NODEMCU调试心得3 - 关于nodemcu的点点滴滴

lua是脚本语言,命令逐行被解释并执行,就像matlab和python一样。在发送窗口输入代码,按回车执行(或者按send按钮)
- 你可以定义Numbers变量,进行代数运算逻辑运算关系运算, 比如在窗口输入

    a=1; b=2; print(a+b); print(a or b); print(a<b)  

回显信息

  3
1
true
  • 也可以定义Strings,进行字符串连接操作,比如:

    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!
    说明几点
    • tablelistrecord两种形式
    • list通常用于数组操作,index默认从1开始,但是可以设置从0开始,比如输入list.[0] = 0
    • 调用record的元素可以用record.c或者record["c"]
    • 代码注释:第一行和第二行分别创建了listrecord,第三行和第四行对其进行操作,追加了元素,第五六两行调用元素并加字符串连接并打印
    • table结构可以嵌套,构建矩阵二维数组
    • listrecord可以混编,两种形式之间一般用;隔开,,;可以互相代替

    还有更复杂的statement表达式,包括 if, while, for,等控制结构,以及function都是套路,以后再介绍。大家可以自己点链接查看。

到这里,我们可以用nodemcu作为平台,认真学习一下lua语言了,请参考lua的官方教程

  • 码字太累,这一部分先到这里,下一部分说一下lua脚本文件,操作系统中的node模块和file模块。