Arduino环境下对NodeMCU ESP8266将文件直接传入flash的三种方式
创始人
2024-05-15 04:27:41
0

flash存储简答介绍

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

SPIFFS(Serial Peripheral Interface Flash File System)

这个函数模块在旧的版本中使用,新版本使用了Little_FS代替该库,接口都一样。
但是这个模块在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   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()){ // 启动SPIFFSSerial.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; iSerial.print((char)dataFile.read());       }
#include 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; iSerial.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 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 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 FSInfo fs_info;void setup() {Serial.begin(9600);SPIFFS.begin();       //启动SPIFFSSerial.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版本测试不行)

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

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

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

3,esp8266芯片官方给的一个下载工具

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

4,可以使用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/

相关内容

热门资讯

安卓共有多少种系统,究竟有多少... 你有没有想过,安卓这个我们每天不离手的操作系统,竟然有那么多不同的版本呢?没错,安卓系统就像一个大家...
安卓系统怎么播放swf,And... 你有没有遇到过这种情况:手里拿着一部安卓手机,想看一个SWF格式的动画,结果发现怎么也打不开?别急,...
pos机安卓系统跟win系统,... 你有没有想过,那些在我们生活中默默无闻的POS机,竟然也有自己的操作系统呢?没错,就是安卓系统和Wi...
俄罗斯封禁安卓系统,本土化替代... 俄罗斯封禁安卓系统的背后:技术、经济与社会的影响在数字化浪潮席卷全球的今天,智能手机已成为我们生活中...
安卓系统总是弹出权限,安卓系统... 手机里的安卓系统是不是总爱和你玩捉迷藏?每次打开一个应用,它就跳出来问你要不要给它开权限,真是让人又...
安卓系统测血氧,便捷健康生活新... 你知道吗?现在科技的发展真是让人惊叹不已!手机,这个我们日常生活中不可或缺的小玩意儿,竟然也能变身成...
蓝光助手安卓系统的,深度解析与... 你有没有发现,现在手机屏幕越来越大,看视频、刷抖音,简直爽到飞起!但是,你知道吗?长时间盯着屏幕,尤...
安卓系统如何隐藏提示,Andr... 你是不是也和我一样,在使用安卓手机的时候,总是被那些弹出来的提示信息打扰到?别急,今天就来教你怎么巧...
安卓6.0系统如何分区,And... 你有没有想过,你的安卓手机里那些神秘的分区到底是怎么来的?别急,今天就来给你揭秘安卓6.0系统如何分...
安卓系统图片怎么涂鸦,指尖上的... 你有没有想过,在安卓系统的手机上,那些单调的图片也能变得生动有趣呢?没错,就是涂鸦!今天,就让我来带...
安卓系统40g,40GB存储空... 你有没有发现,最近你的安卓手机突然变得有点“胖”了呢?没错,就是那个传说中的40G!别急,别慌,今天...
安卓5.0系统怎么重置,轻松实... 手机用久了是不是感觉卡得要命?别急,今天就来教你怎么给安卓5.0系统来个彻底的重置,让它焕发新生!一...
安卓系统是不是快要,安卓系统即... 你有没有发现,最近安卓系统好像有点儿“不安分”了呢?是不是快要发生什么大事情?咱们一起来探个究竟吧!...
安卓6系统和8系统差别,全面对... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,安卓系统也跟着时代的步伐,从6系统一路升...
安卓11系统推荐下载,体验全新... 你有没有发现,最近手机界又掀起了一股热潮?没错,就是安卓11系统!这款全新的操作系统一经推出,就吸引...
原生安卓系统怎样升级,从基础到... 你有没有发现,你的安卓手机用久了,有时候就像老牛拉车一样,慢吞吞的?别急,今天就来给你支个招,让你的...
安卓13系统怎么开发,开发者的... 你有没有听说安卓13系统已经发布了?这可是个大新闻呢!作为一个热衷于手机开发的小伙伴,你是不是也跃跃...
安卓q系统镜像下载,轻松升级体... 你有没有听说安卓Q系统已经发布了?这可是安卓家族里的一大亮点呢!今天,我就要来给你详细介绍一下安卓Q...
安卓系统色彩校正软件,打造个性... 你有没有发现,手机屏幕的色彩有时候会让人感觉不太对劲?有时候,画面看起来有点灰蒙蒙的,有时候又太艳丽...
苹果能否下个安卓系统,开启新篇... 你有没有想过,苹果的iOS系统会不会有一天突然宣布,它要拥抱安卓的大家庭呢?想象iPhone和iPa...