ESP32物联网学习笔记(3)- 闪存文件系统基本操作
系列文章目录
ESP32WROOM32 DEVKIT_C 物联网学习笔记(1)开发板简介及开发环境-CSDN博客
ESP32WROOM32 DEVKIT_C 物联网学习笔记(2)网络服务器-CSDN博客
目录
系列文章目录
前言
一、参考资料
二、ESP32WROOM32闪存文件系统基本操作
1.通过程序向闪存文件系统写入信息
2.通过程序从闪存文件系统读取信息
3.通过程序向闪存文件系统文件添加信息
4.从闪存文件系统中删除文件
总结
前言
在上篇文章中,我们学习了如何搭建一个简单的网络服务器,可以在网页中控制开发板上的LED灯、以及显示开发板的引脚状态信息,初窥物联网。接下来我们学习文件系统。
Q:为什么要用Flash储存文件?
A:开发板在掉电后会损失数据,如果想保存一些数据使其不会随着掉电丢失,可将这些数据储存于Flash中,只需在掉电前将文件写入Flash,上电后读取文件即可。
Q:SPIFFS是什么?
A:Serial Peripheral Interface Flash File System,可称为闪存文件系统。
以下是一些数据(数组,字符串)的读写示例,实际上还可以用于存储网页数据,并在连接至esp32发出的网络服务器时访问这些网页,等等。
更详细的内容参见官方文档:(虽然是Esp8266的,但是Esp32也可参考)
Filesystem — ESP8266 Arduino Core documentation (arduino-esp8266.readthedocs.io)
注意:
1. 依据官方文档:
SPIFFS 目前已弃用,可能会在核心的未来版本中被删除。请考虑将代码移动到 LittleFS。上游开发人员不再积极支持SPIFFS,而LittleFS正在积极开发中,支持真实目录,并且对于大多数操作来说速度快很多倍。
但对于小型系统来说,SPIFFS依旧是够用的(至少对我来说)。
2. SPIFFS有这些缺点:
(1)文件系统是平面的,例如这样的文件名:"/data/wifi.txt",wifi.txt这一文件并不是真正的存在于data这一目录下,我们可以简单视作:我们所指的这个文件,名称就是"/data/wifi.txt"这一字符串。
(2)文件名总共限制为32个字符。一个字符是为C字符串终止保留的,因此我们留下了31个可用字符。
3. 可以利用插件快速的在Arduino IDE中向闪存上传文件,插件可以在github很容易找到。以下内容只是利用代码进行数据的读写。
一、参考资料
本文主要参考自太极创客网站
3-3-1 ESP8266闪存文件系统基本操作 – 太极创客
二、ESP32WROOM32闪存文件系统基本操作
1.通过程序向闪存文件系统写入信息
修改后的代码如下 :
/**********************************************************************
项目名称/Project : 零基础入门学用物联网
程序名称/Program name : esp32-flash-write
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 20191109
程序目的/Purpose : 此程序用于演示如何向NodeMCU的SPIFFS中建立名为
notes.txt的文件,程序还将向该文件写入信息。
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
2024/7/16 王煜明
函数说明:
SPIFFS.open(file_name, "w");
以上函数有两个参数:
第一个参数是被操作的文件名称,本示例中该文件为/notes.txt
第二个参数"w" 代表写入文件信息。(如需了解如何读取信息,请参阅示例程序esp8266-flash-read)
***********************************************************************/
#include <FS.h>
#include <SPIFFS.h>
String file_name = "/demo/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() {
}
烧写代码后,串口输出信息如下:

2.通过程序从闪存文件系统读取信息
修改后的代码如下:
/**********************************************************************
项目名称/Project : 零基础入门学用物联网
程序名称/Program name : esp32-flash-read
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 20191109
程序目的/Purpose : 此程序用于演示如何从NodeMCU的内置SPIFFS中存储的文件notes.txt读取数据。
notes.txt 文件内容将会通过串口监视器显示出来供用户确认。
注意在使用本程序以前需要先将notes.txt 文件上传到NodeMCU开发板的SPIFFS中
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
2024/7/16 王煜明
-----------------------------------------------------------------------
函数说明:
SPIFFS.open(file_name, "r");
以上SPIFFS函数有两个参数:
第一个参数是被操作的文件名称,本示例中该文件为/notes.txt
第二个参数"r" 代表读取文件信息。(如需了解如何写入信息,请参阅示例程序esp8266-flash-write)
***********************************************************************/
#include <FS.h>
#include <SPIFFS.h>
String file_name = "/demo/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() {
}
烧写代码后,串口输出的信息如下:

3.通过程序向闪存文件系统文件添加信息
修改后的代码如下:
/**********************************************************************
项目名称/Project : 零基础入门学用物联网
程序名称/Program name : esp32-flash-append
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 20191109
程序目的/Purpose : 此程序用于演示如何向NodeMCU的内置SPIFFS中存储的文件
notes.txt添加数据。
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
2024/7/16 王煜明
函数说明:
SPIFFS.open(file_name, "a");
以上SPIFFS函数有两个参数:
第一个参数是被操作的文件名称,本示例中该文件为/notes.txt
第二个参数"a" 代表添加文件信息。(如需了解如何读取信息,请参阅示例程序esp8266-flash-read)
此示例程序所演示的是向SPIFFS中的文件里添加信息。这一操作写入信息有所区别。
添加信息是不会删除文件内原有信息,而是在原有信息后面添加新的信息。
但写入操作(示例 esp8266-flash-write.ino)是将文件内容完全清除,重新写入新信息。
***********************************************************************/
#include <FS.h>
#include <SPIFFS.h>
String file_name = "/demo/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() {
}
烧写代码后,串口输出的信息如下:

4.从闪存文件系统中删除文件
修改后的代码如下:
/**********************************************************************
项目名称/Project : 零基础入门学用物联网
程序名称/Program name : esp32-flash-remove
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 20191109
程序目的/Purpose : 此程序用于演示如何删除SPIFFS中存储的文件
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
2024/7/15 王煜明
***********************************************************************/
#include <FS.h>
#include <SPIFFS.h>
String file_name = "/demo/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");
//---------------------------删除文件----------------------------//
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() {
}
烧写代码后,串口输出的信息如下:

总结
以上介绍了ESP32WROOM32闪存文件系统以及写入、读取、添加、删除几种基本操作。
作者:weixin_44167185