目录
一、对ESP8266闪存中进行写操作——SPIFFS.open(file_name, "w");
1.配置闪存flash的大小
2.主要代码解析
1.包含进行FLASH操作的头文件
2.规定在FLASH中文件操作的位置
3.对FLASH原有信息进行清除,执行改代码之后ESP8266自动启动闪存系统
4.监测闪存系统是否启动成功
5.对FLASH进行相应的写操作,写完之后记得需要关闭文件。
6.完整代码
7.运行结果:
二、对ESP8266闪存中进行读操作 —SPIFFS.open(file_name, "r");
1.启动flash
2.寻找闪存之中是否存在刚刚写入的文件名称
3.读取文件信息并进行打印(最后不要忘记关闭flash)
4.完整代码
5.实验现象
三、ESP8266闪存中进行添加操作 —SPIFFS.open(file_name, "a");
1. 完整代码
2.运行现象
四、ESP8266闪存中读取目录—SPIFFS.openDir(folder_name);
1.代码解析
2.完整代码
3.实验现象
五、ESP8266闪存中进行删除操作——SPIFFS.remove(file_name);
1.主要代码:
2.完整代码:
3.现象
六、ESP8266显示闪存文件系统信息
运行结果:
编辑
每一个ESP8266都有自己的闪存系统(全程 Serial Peripheral Interface Flash File System(SPIFFS)),即我们所说的flash存储,这里用于存放我们的用户代码等信息。下面我们基于VScode对其进行配置学习。
先对NodeMCU进行写操作,之后我们再讲写的内容通过串口监视器读出验证操作的正确性。
按照下图操作,先点击下方的NodeMCU,再在弹出的配置框中选择Flash size,由此可见ESP8266的闪存空间有4MB的大小共用户使用,这里我选择FS:1MB(开启1MB空间的闪存大小)
#include
String file_name = "/mistletoe29/notes.txt";
SPIFFS.format(); // 格式化SPIFFS
if(SPIFFS.begin()){ // 启动SPIFFS
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}
这里我写入的信息是("I write something in the flash."),之后我们对FLASH进行读操作即可验证是否正确操作。
File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
dataFile.println("I write something in the flash."); // 向dataFile写入字符串信息
dataFile.close(); // 完成文件写入后关闭文件
Serial.println("Finished Writing data to SPIFFS");
#include
String file_name = "/mistletoe29/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("I write something in the flash."); // 向dataFile写入字符串信息
dataFile.close(); // 完成文件写入后关闭文件
Serial.println("Finished Writing data to SPIFFS");
}
void loop() {
}
串口输出的提示信息正常,完成写操作。
进行完写操作之后,我们将写入闪存的内容读出加以验证操作是否正确。
这里不需要格式化flash了(要是清了刚刚写的就都没有了哈哈哈哈哈),我们直接调用SPIFFS.begin()函数启动flash.
SPIFFS.begin()
这个文件的名字就是刚刚进行写操作的文件名,一定要保持一致
String file_name = "/mistletoe29/notes.txt";
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
#include
String file_name = "/mistletoe29/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
通过串口监视器可知,与之前写入的内容是一致的,可以说明我们的读操作和写操作都是完全正确。
前面内容几乎相同,重点就是添加函数SPIFFS.open(file_name, "a");
File dataFile = SPIFFS.open(file_name, "a");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
dataFile.println("I ADD something IN THE flash."); // 向dataFile添加字符串信息
dataFile.close(); // 完成文件操作后关闭文件
Serial.println("Finished Appending data to SPIFFS");
#include
String file_name = "/mistletoe29/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("I ADD something IN THE flash."); // 向dataFile添加字符串信息
dataFile.close(); // 完成文件操作后关闭文件
Serial.println("Finished Appending data to SPIFFS");
} else {
Serial.print(file_name);
Serial.print(" NOT FOUND.");
}
}
void loop() {
}
串口此时显示添加成功(注意体会添加和写操作的不同,添加是在原来的基础上进行,写操作会对flash进行覆盖操作)
此时 我们可以再次进行读操作看看现在闪存中里有什么(重新运行刚才读操作的代码),结果如下图所示,由于在运行添加操作时多按了几次复位,即多次添加操作,出现了不止一条的添加信息。总的来说添加信息操作成功。
在进行读写操作时,我们可以在flash中创建多个文件夹,对不同的文件夹进行读写操作,必要时需要浏览在目录(本示例之中为mistletoe29目录)下的文件。
截至目前我们都是在在一个文件下进行操作,因此我们不妨在mistoletoe29目录下再定义一个文本文件mistletoe29/myFile.txt。
String file_name = "/mistletoe29/myFile.txt"; //被读取的文件位置和名称
String folder_name = "/mistletoe29"; //被读取的文件夹
查询目录下文件前,不妨对新创建的txt文件进行写操作
File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即myFile.txt)写入信息
dataFile.println("Hello APEX_GAME."); // 向dataFile写入字符串信息
dataFile.close(); // 完成文件写入后关闭文件
Serial.println(F("Finished Writing data to SPIFFS"));
下面进行查询:dir.next()每调用一次就向目录下方移动一次,直至该目录下没有文件,返回假值,while()循环结束。
Dir dir = SPIFFS.openDir(folder_name); // 建立“目录”对象
while (dir.next()) { // dir.next()用于检查目录中是否还有“下一个文件”
Serial.println(dir.fileName()); // 输出文件名
}
}
#include
String file_name = "/mistletoe29/myFile.txt"; //被读取的文件位置和名称
String folder_name = "/mistletoe29"; //被读取的文件夹
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 APEX_GAME."); // 向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() {
}
可知目前有两个txt文件在当前目录(mistletoe29/)下
下面介绍在当前目录下文件删除的操作,删除之后我们再调用SPIFFS.openDir(folder_name)函数对当前目录下的文件进行查看,观测是否只有一个文件了。(预期只剩下一个文件即myFile.txt)
调用SPIFFS.remove(file_name)删除文件;
String file_name = "/mistletoe29/notes.txt"; //被读取的文件位置和名称
if (SPIFFS.remove(file_name)){
Serial.print(file_name);
Serial.println(" remove sucess");
} else {
Serial.print(file_name);
Serial.println(" remove fail");
}
#include
String file_name = "/mistletoe29/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.openDir(folder_name)的函数查看目录下的文件。
由下图可知,只剩下了当时创建的myFile文件,反向验证了删除操作的正确性。
即显示flash的使用情况以及相关文件信息,直接上代码
#include
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() {
}
由此可知,内存使用的量很小。
对内存的主要五种操作介绍完成 。下一篇文章将前三章知识进行整合。