0

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

我有 2 个功能:

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。

在我运行写/读功能之后

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

只读取文件

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

更新1

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

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

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

  1. wifi.txt
  2. 更新.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 为空

这怎么可能发生?我的程序承认里面有数据,但它不会出现在文件中。

更新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”替换。 在此处输入图像描述

我不明白这是怎么回事..

4

0 回答 0