ESP8266学习(三)—— 闪存系统

目录

一、对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对其进行配置学习。

一、对ESP8266闪存中进行写操作——SPIFFS.open(file_name, "w");

1.配置闪存flash的大小

        先对NodeMCU进行写操作,之后我们再讲写的内容通过串口监视器读出验证操作的正确性。

        按照下图操作,先点击下方的NodeMCU,再在弹出的配置框中选择Flash size,由此可见ESP8266的闪存空间有4MB的大小共用户使用,这里我选择FS:1MB(开启1MB空间的闪存大小)

ESP8266学习(三)—— 闪存系统_第1张图片

2.主要代码解析

1.包含进行FLASH操作的头文件

#include   

2.规定在FLASH中文件操作的位置

String file_name = "/mistletoe29/notes.txt"; 

3.对FLASH原有信息进行清除,执行改代码之后ESP8266自动启动闪存系统

SPIFFS.format();    // 格式化SPIFFS

4.监测闪存系统是否启动成功

 if(SPIFFS.begin()){ // 启动SPIFFS
    Serial.println("SPIFFS Started.");
  } else {
    Serial.println("SPIFFS Failed to Start.");
  }
  

5.对FLASH进行相应的写操作,写完之后记得需要关闭文件。

        这里我写入的信息是("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");

6.完整代码

#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() {
}

7.运行结果:

        串口输出的提示信息正常,完成写操作。

ESP8266学习(三)—— 闪存系统_第2张图片

二、对ESP8266闪存中进行读操作 —SPIFFS.open(file_name, "r");

        进行完写操作之后,我们将写入闪存的内容读出加以验证操作是否正确。

1.启动flash

         这里不需要格式化flash了(要是清了刚刚写的就都没有了哈哈哈哈哈),我们直接调用SPIFFS.begin()函数启动flash.

SPIFFS.begin()

2.寻找闪存之中是否存在刚刚写入的文件名称

        这个文件的名字就是刚刚进行写操作的文件名,一定要保持一致

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.");
  }

3.读取文件信息并进行打印(最后不要忘记关闭flash)

 //建立File对象用于从SPIFFS中读取文件
  File dataFile = SPIFFS.open(file_name, "r"); 
 
  //读取文件内容并且通过串口监视器输出文件信息
  for(int i=0; i

4.完整代码

#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

5.实验现象

        通过串口监视器可知,与之前写入的内容是一致的,可以说明我们的读操作和写操作都是完全正确。

ESP8266学习(三)—— 闪存系统_第3张图片

三、ESP8266闪存中进行添加操作 —SPIFFS.open(file_name, "a");

        前面内容几乎相同,重点就是添加函数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");

 1. 完整代码 


#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() {
}

2.运行现象

       串口此时显示添加成功(注意体会添加和写操作的不同,添加是在原来的基础上进行,写操作会对flash进行覆盖操作)

ESP8266学习(三)—— 闪存系统_第4张图片

        此时 我们可以再次进行读操作看看现在闪存中里有什么(重新运行刚才读操作的代码),结果如下图所示,由于在运行添加操作时多按了几次复位,即多次添加操作,出现了不止一条的添加信息。总的来说添加信息操作成功。

ESP8266学习(三)—— 闪存系统_第5张图片

四、ESP8266闪存中读取目录—SPIFFS.openDir(folder_name);

        在进行读写操作时,我们可以在flash中创建多个文件夹,对不同的文件夹进行读写操作,必要时需要浏览在目录(本示例之中为mistletoe29目录)下的文件。

1.代码解析

        截至目前我们都是在在一个文件下进行操作,因此我们不妨在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()); // 输出文件名
  }
}

 2.完整代码

#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() {
}

3.实验现象 

        可知目前有两个txt文件在当前目录(mistletoe29/)下

五、ESP8266闪存中进行删除操作——SPIFFS.remove(file_name);

        下面介绍在当前目录下文件删除的操作,删除之后我们再调用SPIFFS.openDir(folder_name)函数对当前目录下的文件进行查看,观测是否只有一个文件了。(预期只剩下一个文件即myFile.txt)

1.主要代码:

        调用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");
  }                       

2.完整代码:

#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() {
}

3.现象 

        这里显示的删除失败是正常现象,和之前一个道理,由于代码下载成功之后会自动运行一遍的代码已经完成了删除操作,于是当再次按下复位时,已经不存在该文件了,所以删除失败。

        为了验证删除操作的正确性我们再次调用上述 读取目录SPIFFS.openDir(folder_name)的函数查看目录下的文件。

由下图可知,只剩下了当时创建的myFile文件,反向验证了删除操作的正确性。

ESP8266学习(三)—— 闪存系统_第6张图片

六、ESP8266显示闪存文件系统信息

        即显示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() {
}

 运行结果:

        由此可知,内存使用的量很小。

ESP8266学习(三)—— 闪存系统_第7张图片

对内存的主要五种操作介绍完成 。下一篇文章将前三章知识进行整合。

你可能感兴趣的:(学习)