Arduino环境下对NodeMCU ESP8266的闪存flash系统使用

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

flash存储简答介绍

参考https://www.elecfans.com/consume/572040.html
flash存储器又称闪存快闪存储器就其本质而言flash存储器属于EEPROM电擦除可编程只读存储器类型。是一种长寿命的非易失性在断电情况下仍能保持所存储的数据信息的存储器。

SPIFFS(Serial Peripheral Interface Flash File System)

但是这个模块在vs code 的platformIO中编写时显示被丢弃不再进行更改。
对flash对象的操作方式就和文件的读写方式很类似可参考https://blog.csdn.net/weixin_43794311/article/details/104224924
https://blog.csdn.net/weixin_43794311/article/details/128322954
常用:w写入会把旧的数据清空r从开始只读a在文件末尾添加
功能对flash内存的写入。

想要开启使用SPIFFS需要准备

1MCU的完好性且有FLASH空间
2在Arduino的IDE中分配有flash空间如下图所示

下图中的FS大小就是分配的flash空间OTAon-the-air technologe指的是用于固件升级分配的空间
可参考https://blog.csdn.net/bulebin/article/details/108428643
在这里插入图片描述

在这里插入图片描述

对文件的读写

简单的写w入实例但w方式写入会将文件中的内容清空再重新写入

主要起作用的几句程序

 SPIFFS.format(); //格式化flash也是很有用的
File dataFile = SPIFFS.open(file_name, "w");// 先清空文件中旧数据再写入如果是
  //File dataFile = SPIFFS.open(file_name, "a");  //这种方式就不会清楚旧数据而是在文件最后添加内容
  dataFile.println("Hello IOT World.");       // 向dataFile写入字符串信息
  dataFile.close();                           // 完成文件写入后关闭文件
#include <FS.h>  
 
String file_name = "/MAR/notes.txt"; //被读取的文件位置和名称
 
void setup() {

  Serial.begin(9600);
  Serial.println("");
  Serial.println("SPIFFS format start");
  SPIFFS.format();    // 格式化SPIFFS。先清空了flash
  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 dataFile = SPIFFS.open(file_name, "a");  //这种方式就不会清楚旧数据而是在文件最后添加内容
  dataFile.println("Hello IOT World.");       // 向dataFile写入字符串信息
  dataFile.close();                           // 完成文件写入后关闭文件
  Serial.println("Finished Writing data to SPIFFS");
}
 
void loop() {
}

读取r写入的内容

由于flash是断电后也不会丢失数据的存储所以在上面程序写入内容后。即使断电后再插上下载下面的读取程序数据也会被读取出来。
主要起作用的程序

  //建立File对象用于从SPIFFS中读取文件
  File dataFile = SPIFFS.open(file_name, "r");   //这是r模式表示只读

  //读取文件内容并且通过串口监视器输出文件信息
  for(int i=0; i<dataFile.size(); i++){
    Serial.print((char)dataFile.read());       
  }
#include <FS.h>

String file_name = "/MAR/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");   //这是r模式表示只读

  //读取文件内容并且通过串口监视器输出文件信息
  for(int i=0; i<dataFile.size(); i++){
    Serial.print((char)dataFile.read());       
  }
  //完成文件读取后关闭文件
  dataFile.close();                           
}

void loop() {
}

对目录下文件的显示

主要起作用的一段

  File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象即myFile.txt写入信息
  dataFile.println("Hello MAR.");    // 向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()); // 输出文件名
  }
}
#include <FS.h>
 
String file_name = "/MAR/myFile.txt"; //被读取的文件位置和名称
String folder_name = "/MAR";         //被读取的文件夹
 
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 MAR.");    // 向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() {
}

串口结果显示及分析上面程序只是建立了一个/MAR/myFile.txt文件但会出现两个是因为flash的保持功能就像U盘复制文件后还能在不同设备上查看。程序的下载不会处理flash部分的内存文件
在这里插入图片描述

移除文件操作

主要作用的代码

SPIFFS.remove(file_name)
#include <FS.h>

String file_name = "/MAR/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() {
}

显示flash的系统信息

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

直接向开发板的flash传入文件2.0.3版本测试不行

Arduino的1.x版本的可以尝试使用下面方式

旧版本的ide可以参考这个
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/spiffs/upload-files/
在这里插入图片描述

Arduino2.x版本暂时没发现什么好的方法

对应esp8266芯片的官方给了一个下载文件的官网地址https://www.espressif.com.cn/zh-hans/support/download/other-tools
下载到flash的操作可查看

可以使用vs code和插件platformIO完成

参考https://blog.csdn.net/weixin_43794311/article/details/128736410

一个小网址的传入和访问

参考https://blog.csdn.net/weixin_43794311/article/details/128736410
需要使用其中修改的程序但图片网页资源需要参考http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/spiffs/spiffs-web-server/load-imagecsss-javascript/

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6