Arduino IDE ESP32 设备使用 SPIFFS 来保存

问题描述

我正在编写 ESP32 程序并使用 SPIFFS 来保存一些数据,因为我不想在设备断电后丢失它。

我有两个功能

char* readFile(fs::FS &fs,const char *path)
{
    Serial.printf("Reading file: %s\n",path);

    File file = fs.open(path);
    if (!file || file.isDirectory())
    {
        Serial.println("Failed to open file for reading");
        return "FAIL";
    }

    Serial.print("Read from file: ");
    while (file.available())
    {
        Serial.write(file.read());
        delayMicroseconds(100);
        //Todo
        //append all characters and return it as a list of char arrays at the end of reading
    }
    file.close();
    
}


void writeFile(fs::FS &fs,const char *path,const char *message)
{
    Serial.printf("Writing file: %s\n",path);

    File file = fs.open(path,FILE_WRITE);
    if (!file)
    {
        Serial.println("Failed to open file for writing");
        return;
    }
    if (file.print(message))
    {
        Serial.println("File written");
    }
    else
    {
        Serial.println("Write Failed");
    }

    file.close();
}

首先,我运行我的程序并调用 writeFile(),然后调用 readFile():

    int n = 0;
    Wifi_setup();
    Spiffs_setup();
    n = scan_wifi_networks();

    
    Serial.print("list_strings outside scan function = ");
    for (int i = 0 ; i<=n ; i++){
      Serial.println(found_networks[i]);
    }
    //compare list_strings with preset wifi networks. If match,everything is fine,if not,problem!


    writeFile(SPIFFS,"/wifi.txt","Telia-33F8A3-Greitas");
    char* kNown_networks = readFile(SPIFFS,"/wifi.txt");

 
    //send USD to the server,go back to sleep
    //initialize_deep_sleep();
}

那部分工作正常。从串行监视器中,我可以看到它已成功将我的文本写入 wifi.txt。

After I run write/read functions

接下来,我注释掉写函数,只留下读函数。我再次运行代码,它无法读回我的文本:

Only readFile

有人能帮我理解为什么会这样吗?我以为如果我给 spiffs 写过一次,我之后就可以访问它,但事实并非如此。我以前使用过 EEPROM,这似乎有效。我可以写入 EEPROM 地址并稍后简单地访问相同的地址,并且断电后该值仍然存在。任何帮助表示赞赏。提前致谢。

更新1

在写入数据后,我设法从我的 SPIFFS 中读回了数据。我错过了一个关键步骤: https://randomnerdtutorials.com/install-esp32-filesystem-uploader-arduino-ide/

但是,现在,我遇到了另一个问题:

在我的项目文件夹中,我创建了一个应该由 SPIFFS 访问的文件夹“data”。在那里,我创建了 2 个文件

  1. wifi.txt
  2. update.bin

update.bin 目前不相关。让我们谈谈wifi.txt

在我写入 Spiffs 之后,我现在注释掉 writeFile 函数并且只忽略 readFile。我的串行监视器的结果:

load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4
Listing directory: /
  FILE: /update.bin  SIZE: 0
  FILE: /wifi.txt  SIZE: 20
Reading file: /wifi.txt
Read from file: Telia-33F8A3-Greitas

正如您从上面的串行监视器中看到的,我的程序可以识别我写入 spifs /wifi.txt 文件的文本。然而,当我进入我的实际项目目录并打开 data/wifi.txt 时,它是 emtpy:

wifi.txt empty

怎么会这样?我的程序承认里面有数据,但它不会显示文件中。

更新2

我对 SPIFFS 做了一些进一步的测试。

在我的数据文件夹中,我创建了另一个 txt 文件 test.txt。在那里,我手动添加了一些文本“这是短信”。

在我的程序中,我调用函数

char* returned_data = readFile(SPIFFS,"/test.txt");

并且串行监视器成功地打印了我放置的消息。这证明了 SPIFFS 能够毫无问题地从文件中回读。

然后,我修改了我的程序:

    writeFile(SPIFFS,"/test.txt","hello123");
    char* returned_data = readFile(SPIFFS,"/test.txt");

上面的代码应该覆盖我用“hello123”写入我的txt文件的任何内容,然后我的程序应该从Spiffs读回“hello123”。串行监视器响应:

Listing directory: /
  FILE: /update.bin  SIZE: 0
  FILE: /wifi.txt  SIZE: 2
  FILE: /test.txt  SIZE: 8
Writing file: /test.txt
File written
Reading file: /wifi.txt
Read from file: 
Reading file: /test.txt
Read from file: hello123

如您所见,它能够成功读回“hello123”。

但是,当我转到我的项目文件夹时,打开 data/test.txt,我仍然可以看到我的初始文本没有被“hello123”替换。

enter image description here

我不明白这是怎么发生的..

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)