ESP8266 NodeMCU 闪存文件系统(SPIFFS)

ESP8266 NodeMCU 闪存文件系统(SPIFFS)

ESP8266闪存文件系统基本操作

不知道您有没有想过,当我们上传程序给ESP8266时,我们的程序具体存放在什么地方呢?

每一个ESP8266都配有一个闪存,这个闪存很像是一个小硬盘,我们上传的文件就被存放在这个闪存里。这个闪存的全称是Serial Peripheral Interface Flash File System(SPIFFS)。

除了可以存放上传的程序以外,我们还可以将网页文件或者系统配置文件存放在ESP8266的闪存中。在这里,我们将学习如何利用程序对闪存文件系统(SPIFFS)进行文件读取和修改。

  1. 通过程序向闪存文件系统写入信息
#include <FS.h>  
 
String file_name = "/taichi-maker/notes.txt"; //被读取的文件位置和名称
 
void setup() {
  Serial.begin(9600);
  Serial.println("");
  
  Serial.println("SPIFFS format start");
  SPIFFS.format();    // 格式化SPIFFS
  Serial.println("SPIFFS format finish");
  
  if(SPIFFS.begin()){ // 启动SPIFFS
    Serial.println("SPIFFS Started.");
  } else {
    Serial.println("SPIFFS Failed to Start.");
  }
  
  File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
  dataFile.println("Hello IOT World.");       // 向dataFile写入字符串信息
  dataFile.close();                           // 完成文件写入后关闭文件
  Serial.println("Finished Writing data to SPIFFS");
}
 
void loop() {
}

代码详解:

在使用SPIFFS存储文件以前,我们必须使用#include “FS.h”

/taichi-maker/代表根目录下的taichi-maker目录。notes.txt代表着文件名称。

SPIFFS.format();是对闪存文件系统进行格式化。这很想是我们对u盘进行格式化的操作。您无需每次使用闪存文件系统都对它进行格式化操作。这里仅仅是为了演示如何使用SPIFFS.format();。

SPIFFS.begin()用于启动闪存文件系统。在每次使用闪存文件系统以前都需要执行这一操作。如果闪存文件系统成功启动,该函数的返回值为布尔型,如果成功启动闪存文件形同,则返回真。否则将返回假。

File dataFile = SPIFFS.open(file_name, “w”);这条语句中,open函数可用于对SPIFFS进行操作。该函数共有两个参数。第一个参数file_name是被操作的文件名称,本示例中该文件为/taichi-maker/notes.txt
第二个参数"w"代表此操作为向SPIFFS写入文件信息。请注意:如果文件系统没有/taichi-maker/notes.txt文件,此操作将会在文件系统中建立该文件。如果文件系统有该文件,则程序将会重新建立该文件,即原有文件信息将会被覆盖。

dataFile.println(“Hello IOT World.”);用于向dataFile文件写入信息。信息内容为“Hello IOT World.”。

dataFile.close();用于关闭dataFile文件。结束文件操作后,应执行此操作。

  1. 通过程序从闪存文件系统读取信息
#include <FS.h>
 
String file_name = "/taichi-maker/notes.txt";              //被读取的文件位置和名称
 
void setup() {
  Serial.begin(9600);
  Serial.println("");
  
  if(SPIFFS.begin()){ // 启动闪存文件系统
    Serial.println("SPIFFS Started.");
  } else {
    Serial.println("SPIFFS Failed to Start.");
  }
 
  //确认闪存中是否有file_name文件
  if (SPIFFS.exists(file_name)){
    Serial.print(file_name);
    Serial.println(" FOUND.");
  } else {
    Serial.print(file_name);
    Serial.print(" NOT FOUND.");
  }
 
  //建立File对象用于从SPIFFS中读取文件
  File dataFile = SPIFFS.open(file_name, "r"); 
 
  //读取文件内容并且通过串口监视器输出文件信息
  for(int i=0; i<dataFile.size(); i++){
    Serial.print((char)dataFile.read());       
  }
 
  //完成文件读取后关闭文件
  dataFile.close();                           
}
 
void loop() {
}

SPIFFS.exists(file_name)用于检查闪存文件系统中有file_name文件。该函数返回值为布尔型。如果文件存在则返回真,否则将返回假。

File dataFile = SPIFFS.open(file_name, “r”);这条语句中,open函数可用于对SPIFFS进行操作。该函数共有两个参数。第一个参数file_name是被操作的文件名称,本示例中该文件为/taichi-maker/notes.txt
第二个参数"r"代表此操作为读取文件信息。

for循环语句中,循环条件使用了函数dataFile.size()。该函数将会返回dataFile的大小。循环语句体中,dataFile.read()将会读取dataFile文件内容。每调用一次该含税都会返回dataFile文件中一个字符。再次调用,将会返回下一个字符。以此类推,直到dataFile结尾。通过for循环语句,程序将会依次读取dataFile文件内容,并且将文件内容逐字符输出于串口监视器中。

  1. 通过程序向闪存文件系统文件添加信息
#include <FS.h>
 
String file_name = "/taichi-maker/notes.txt";              //被读取的文件位置和名称
 
void setup() {
  Serial.begin(9600);
  Serial.println("");
  
  if(SPIFFS.begin()){ // 启动闪存文件系统
    Serial.println("SPIFFS Started.");
  } else {
    Serial.println("SPIFFS Failed to Start.");
  }
 
  //确认闪存中是否有file_name文件
  if (SPIFFS.exists(file_name)){
    
    Serial.print(file_name);
    Serial.println(" FOUND.");
 
    File dataFile = SPIFFS.open(file_name, "a");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
    dataFile.println("This is Appended Info."); // 向dataFile添加字符串信息
    dataFile.close();                           // 完成文件操作后关闭文件   
    Serial.println("Finished Appending data to SPIFFS");
    
  } else {
    Serial.print(file_name);
    Serial.print(" NOT FOUND.");
  }
                        
}
 
void loop() {
}

File dataFile = SPIFFS.open(file_name, “a”);这条语句中,open函数可用于对SPIFFS进行操作。该函数共有两个参数。第一个参数file_name是被操作的文件名称,第二个参数"a"代表向该文件添加信息。请留意,此处的添加信息是不会删除文件内原有信息,而是在原有信息后面添加新的信息。这与但写入操作是有所区别的。写入操作是将文件内容完全清除,重新写入新信息。

dataFile.println(“This is Appended Info.”),此语句作用将会向dataFile文件尾部添加双引号中的信息内容,也就是在文件尾部添加“This is Appended Info.”。

  1. 通过程序读取目录内容
#include <FS.h>
 
String file_name = "/taichi-maker/myFile.txt"; //被读取的文件位置和名称
String folder_name = "/taichi-maker";         //被读取的文件夹
 
void setup() {
  Serial.begin(9600);
  Serial.println("");
  
  if(SPIFFS.begin()){ // 启动闪存文件系统
    Serial.println("SPIFFS Started.");
  } else {
    Serial.println("SPIFFS Failed to Start.");
  }
 
  File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即myFile.txt)写入信息
  dataFile.println("Hello Taichi-Maker.");    // 向dataFile写入字符串信息
  dataFile.close();                           // 完成文件写入后关闭文件
  Serial.println(F("Finished Writing data to SPIFFS"));
 
  // 显示目录中文件内容以及文件大小
  Dir dir = SPIFFS.openDir(folder_name);  // 建立“目录”对象
  
  while (dir.next()) {  // dir.next()用于检查目录中是否还有“下一个文件”
    Serial.println(dir.fileName()); // 输出文件名
  }
}
 
void loop() {
}

SPIFFS.openDir(folder_name)中的openDir函数函将返回一个“目录”对象并且赋值给dir。此”目录”对象正是folder_name所存储的/taichi-maker/目录。后续程序对dir的所有操作都是针对/taichi-maker/所执行的。

while循环语句的循环条件是dir.next()的返回值。dir.next()函数用于检查dir文件夹内的文件。我们可以想象dir文件夹里有一个指针,每一次调用next函数都会让指针向下挪动一格。每一次挪动一格,如果下一个位置有文件,则返回真。否则将会返回假。因此,while (dir.next())循环语句中的内容会依次显示dir文件夹中的每一个文件的文件名。

  1. 从闪存文件系统中删除文件
#include <FS.h>
 
String file_name = "/taichi-maker/notes.txt";              //被读取的文件位置和名称
 
void setup() {
  Serial.begin(9600);
  Serial.println("");
  
  if(SPIFFS.begin()){ // 启动闪存文件系统
    Serial.println("SPIFFS Started.");
  } else {
    Serial.println("SPIFFS Failed to Start.");
  }
  
  //从闪存中删除file_name文件
  if (SPIFFS.remove(file_name)){
    
    Serial.print(file_name);
    Serial.println(" remove sucess");
    
  } else {
    Serial.print(file_name);
    Serial.println(" remove fail");
  }                       
}
 
void loop() {
}

SPIFFS.remove(file_name)将file_name所指代的文件进行了删除操作。另外,SPIFFS.remove(file_name)的返回值为布尔型。如果文件删除执行成功则返回真,否则返回假。

  1. 显示闪存文件系统信息
#include <FS.h>
 
FSInfo fs_info;
 
void setup() {
  Serial.begin(9600);
 
  SPIFFS.begin();       //启动SPIFFS
  Serial.println("");
  Serial.println("SPIFFS Started.");
 
  // 闪存文件系统信息
  SPIFFS.info(fs_info);
 
  // 可用空间总和(单位:字节)
  Serial.print("totalBytes: ");     
  Serial.print(fs_info.totalBytes); 
  Serial.println(" Bytes"); 
 
  // 已用空间(单位:字节)
  Serial.print("usedBytes: "); 
  Serial.print(fs_info.usedBytes);
  Serial.println(" Bytes"); 
 
  // 最大文件名字符限制(含路径和'\0')
  Serial.print("maxPathLength: "); 
  Serial.println(fs_info.maxPathLength);
 
  // 最多允许打开文件数量
  Serial.print("maxOpenFiles: "); 
  Serial.println(fs_info.maxOpenFiles);
 
  // 存储块大小
  Serial.print("blockSize: "); 
  Serial.println(fs_info.blockSize);
 
  // 存储页大小
  Serial.print("pageSize: ");
  Serial.println(fs_info.pageSize);
}
 
void loop() {
}

FSInfo fs_info;建立了FSInfo 对象,用于存储闪存状态信息。

SPIFFS.info(fs_info);。通过info函数将闪存状态信息赋给fs_info。后续的程序中,通过一系列语句将闪存状态信息通过串口监视器输出。具体信息内容可参考程序注释部分。

通过Arduino IDE向闪存文件系统上传文件

  • 准备工作
  1. 将NodeMCU开发板与电脑通过USB数据线连接好。
  2. NodeMCU开发板驱动已经安装完毕
  3. 设置Arduino IDE以使其支持NodeMCU开发板
  1. 下载 Arduino-ESP8266闪存文件插件程序

链接:https://pan.baidu.com/s/1586eN4MA3ZF-2m-fNdy8PA
提取码:chlg

  1. 确定Arduino IDE项目文件夹位置
    在这里插入图片描述
    在这里插入图片描述

  2. 通过资源管理器打开Arduino IDE项目文件夹并建立tools文件夹
    在这里插入图片描述

  3. 解压缩esp8266fs插件压缩包,并将解压缩后的文件内容粘贴到项目文件夹中
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  4. 重新启动Arduino IDE
    为了让ESP8266FS闪存文件上传插件生效,我们需要重新启动Arduino IDE

  5. 检查“工具”菜单确认插件安装
    在这里插入图片描述

  6. 根据上传的文件总大小来设置闪存大小
    在这里插入图片描述

  7. 将需要上传的文件保存在程序路径下的data文件夹中
    在这里插入图片描述
    在这里插入图片描述
    9.上传过程中可能出现的错误,及改正方法
    在这里插入图片描述
    在这里插入图片描述

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ESP8266是一款强大的Wi-Fi芯片,可以实现与互联网的连接,而NodeMCU则是基于ESP8266开发板的一种程序开发环境,能够方便地实现对ESP8266的开发与管理。因此,ESP8266 NodeMCU的原理图即为基于ESP8266NodeMCU开发板的电路原理图。 从电路原理图上可以看出,ESP8266 NodeMCU主要由ESP8266芯片、USB转串口芯片以及其他外围电路组成。ESP8266芯片作为处理器来控制整个电路的运作,并且实现与Wi-Fi网络通讯;USB转串口芯片则是将电脑上的串口信号转换成用于与ESP8266芯片进行通讯的USB接口。此外,还包括了电源管理电路、LED指示灯等。 需要注意的是,ESP8266芯片在高端模式下会消耗大量的电流,因此,NodeMCU的外围电路需要合理设计使其能够保证电路稳定运行。同时,在编写代码过程中,需要遵循各种芯片的电气特性,并根据不同运行状态设置对应的电流和电压值。 总的来说,ESP8266 NodeMCU的原理图是一个复杂的电路系统,需要对各个芯片的特性有深入的了解并具备一定的电路设计能力。通过合理的设计和编写代码,可以利用这款芯片实现各种应用,从而满足不同领域的需求。 ### 回答2: ESP8266 NodeMCU是一款基于ESP8266 Wi-Fi模块的开源电子平台,它的原理图可以分为以下几个模块。 1. 电源模块:ESP8266 NodeMCU支持5V电源输入,通过稳压电路将电压转换为3.3V供给ESP8266芯片和其他模块。 2. USB转串口模块:ESP8266 NodeMCU可以通过Micro-USB口与计算机连接,实现与计算机的数据通信。这里采用了CH340E芯片作为USB转串口模块。 3. ESP8266 Wi-Fi模块:ESP8266芯片是本平台的核心,它支持802.11 b/g/n Wi-Fi协议,集成了TCP/IP协议栈,可以进行远程控制。 4. LED指示灯:ESP8266 NodeMCU板上集成了一个LED指示灯,用于指示电源状态、Wi-Fi连接状态、数据传输状态等。 5. GPIO扩展模块:ESP8266 NodeMCU支持多个GPIO引脚,可以通过它们连接各种传感器、执行器等外部设备,实现更多的功能。 6. 其他部件:ESP8266 NodeMCU还包括晶振、电容、电阻等元件,它们共同构成了一个高性能、低功耗的电子平台。 总之,ESP8266 NodeMCU原理图揭示了该平台的组成结构及内部连接关系,为开发者提供了重要的参考资料,可以帮助开发者更好地理解ESP8266 NodeMCU平台,以及实现更多创新性的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值