Esp8266的Flash读写操作以及Flash上传文件

1、Flash的读写操作
Esp8266的Flash为4M,其中1M用于存储程序,其他的空间有一部分用于系统,3M中剩下的大部分空间可以用来存放文件。

#include <FS.h>
String file_name = "/Fle/note.txt"; //被读取的文件位置和名称,放在/Fle文件夹下

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_write(file_name, "1111");
  file_read(file_name);
  file_add(file_name, "2222");
  file_read(file_name);
}
void loop() {
}

//写操作
void file_write(String file_name, String content)
{
  /*****************************************写入闪存文件内容*************************************************/
  File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
  dataFile.println(content);       // 向dataFile写入字符串信息
  dataFile.close();                           // 完成文件写入后关闭文件
  Serial.print("已写入闪存文件内容:");
  Serial.println(content);
}
//读操作
void file_read(String file_name)
{
  //确认闪存中是否有file_name文件
  File dataFile;
  if (SPIFFS.exists(file_name))
  {
    //建立File对象用于从SPIFFS中读取文件
    dataFile = SPIFFS.open(file_name, "r");
    //读取文件内容并且通过串口监视器输出文件信息
    Serial.println("读取的文件内容:");
    for (int i = 0; i < dataFile.size(); i++)
    {
      Serial.print((char)dataFile.read());
    }
  }
  else
  {
    Serial.print(file_name);
    Serial.print(" NOT FOUND.");
  }
  //完成文件读取后关闭文件
  dataFile.close();
}
//追加操作
void file_add(String file_name, String content)
{
  if (SPIFFS.exists(file_name))
  {
    File dataFile = SPIFFS.open(file_name, "a");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
    dataFile.println(content); // 向dataFile添加字符串信息
    dataFile.close();                           // 完成文件操作后关闭文件
    Serial.println("已经增添内容:");
    Serial.println(content);
  }
  else 
  {
    Serial.print(file_name);
    Serial.print(" NOT FOUND.");
  }
}

在这里插入图片描述
2、Flash上传文件并读取显示,以此来验证是否真的上传了
这里为了完成上传到Flash的任务,需要下载一个基于esp8266和Arduino的Flash文件上传插件
下面是安装Flash文件上传插件的具体步骤:
请添加图片描述
tools文件夹是要自己新建的,放在tools文件夹下的ESP8266FS文件夹是解压后的文件夹。记得设置完后要重启Arduino IDE软件才能生效。
下面采用这个插件进行Flash文件上传并验证:
首先在工程文件夹下新建一个data文件夹,把要上传的文件放在data文件夹下。打开Arduino IDE后点击工具-----ESP8266 Sketch Data Upload,点击之后会看到Esp8266的蓝灯在闪烁。烧录完成之后文件就已经保存在Esp8266的Flash里了。
请添加图片描述

现在利用以下程序来验证:

#include <FS.h>
String file_name = "/note.txt"; //被读取的文件位置和名称,放在根目录

void setup() {
  Serial.begin(9600);
  Serial.println("");

  if (SPIFFS.begin()) { // 启动SPIFFS
    Serial.println("SPIFFS Started.");
  } else {
    Serial.println("SPIFFS Failed to Start.");
  }
  file_read(file_name);
  file_add(file_name, "\n2222");
  file_read(file_name);
}
void loop() {
}


void file_write(String file_name, String content)
{
  /*****************************************写入闪存文件内容*************************************************/
  File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
  dataFile.println(content);       // 向dataFile写入字符串信息
  dataFile.close();                           // 完成文件写入后关闭文件
  Serial.print("已写入闪存文件内容:");
  Serial.println(content);
}
void file_read(String file_name)
{
  //确认闪存中是否有file_name文件
  File dataFile;
  if (SPIFFS.exists(file_name))
  {
    //建立File对象用于从SPIFFS中读取文件
    dataFile = SPIFFS.open(file_name, "r");
    //读取文件内容并且通过串口监视器输出文件信息
    Serial.println("读取的文件内容:");
    for (int i = 0; i < dataFile.size(); i++)
    {
      Serial.print((char)dataFile.read());
    }
  }
  else
  {
    Serial.print(file_name);
    Serial.print(" NOT FOUND.");
  }
  //完成文件读取后关闭文件
  dataFile.close();
}
void file_add(String file_name, String content)
{
  if (SPIFFS.exists(file_name))
  {
    File dataFile = SPIFFS.open(file_name, "a");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
    dataFile.println(content); // 向dataFile添加字符串信息
    dataFile.close();                           // 完成文件操作后关闭文件
    Serial.println("已经增添内容:");
    Serial.println(content);
  }
  else 
  {
    Serial.print(file_name);
    Serial.print(" NOT FOUND.");
  }
}

上面程序中不能再进行SPIFFS.format()格式化操作了,否则会把刚保存进去的文件清除掉,并且注意到放在data文件夹下的文件均是放在esp8266的Flash的根目录下的,所以程序中的文件目录也应该用/note.txt。同时也要注意不能在程序中再对/note.txt文件进行写操作,否则也会覆盖掉123456789这个信息。
运行结果:
在这里插入图片描述
从上面可以看出,除了123456789,后面还有两个2222,这是因为在下载完成后会运行一遍程序,为了让串口显示数据我按了一次复位键,所以程序运行了两遍,追加了两次2222。

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: ESP32 FLASH读写是通过SPI接口进行的,可以使用ESP-IDF提供的SPI Master驱动程序来实现。在使用SPI Master驱动程序之前,需要先初始化SPI总线和SPI设备。然后,可以使用spi_device_transmit函数来发送和接收数据。在写入FLASH时,需要先擦除FLASH扇区,然后再写入数据。在读取FLASH时,可以直接从FLASH中读取数据。 ### 回答2: ESP32是一款强大的开发板,内置了丰富的存储空间,其中包括了FLASH存储器。FLASH存储器可以用来读取和写入数据。 在ESP32上进行FLASH读写操作需要使用ESP-IDF框架提供的API函数。主要的函数有`spi_flash_read`和`spi_flash_write`。 `spi_flash_read`函数用于从FLASH存储器中读取数据。它需要指定要读取的地址和数据缓冲区的大小。可以通过指定偏移量和大小来实现读取某个特定范围内的数据。 `spi_flash_write`函数用于向FLASH存储器中写入数据。它需要指定要写入的地址和数据缓冲区的大小。需要注意的是,写入操作会擦除目标地址上的数据,因此确保在执行写入操作之前备份数据是非常重要的。 读取和写入的地址是以字节为单位的。在使用这些函数之前,需要对SPI Flash进行初始化,这可以通过在代码中调用`esp_flash_init`函数来实现。 除了读取和写入数据之外,还可以使用`spi_flash_erase_sector`函数来擦除一个扇区的数据。它需要指定要擦除的扇区的地址。需要注意的是,扇区的大小通常为4KB。 总结起来,ESP32的FLASH存储器可以通过`spi_flash_read`和`spi_flash_write`函数进行读写操作,还可以使用`spi_flash_erase_sector`函数进行扇区擦除操作。在使用这些函数之前需要对SPI Flash进行初始化。通过这些API函数,我们可以方便地在ESP32上进行FLASH读写操作。 ### 回答3: ESP32是一款集成式的芯片,它具备了内置的Flash存储器,用于存储程序和数据。Flash存储器被分为多个扇区,每个扇区都有自己的地址范围和大小。ESP32支持从Flash读取数据以及将数据写入Flash的功能。 要从Flash中读取数据,我们通常需要先确定要读取的数据存储在哪个扇区中。然后,我们使用ESP32的Flash读取命令,通过指定数据在该扇区中的偏移地址来读取数据。读取的数据可以存储在缓冲区中,用于后续的处理。 而要将数据写入Flash,则首先需要选择一个空闲的扇区来存储数据。然后,将要写入的数据存储在一个缓冲区中。最后,我们使用ESP32的Flash编程命令,将缓冲区中的数据写入到选定的扇区中。 需要注意的是,写入Flash时会覆盖原有的数据。因此,在执行写入操作之前,我们应该先备份任何我们希望保留的数据。 除了基本的读写操作,ESP32还提供了其他一些功能,例如擦除整个Flash存储器或者擦除特定扇区。这些功能可以在需要时使用。 总之,ESP32的Flash读写功能为我们提供了一种方便的方式来访问和存储数据。通过合理地利用这些功能,我们可以在ESP32上开发出各种应用,从简单的数据存储到复杂的程序存储。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F l e

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值