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需要准备
1,MCU的完好性,且有FLASH空间
2,在Arduino的IDE中,分配有flash空间(如下图所示)
下图中的FS大小就是分配的flash空间,OTA(on-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版本暂时没发现什么好的方法
可以使用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/