我编写 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 个文件:
- wifi.txt
- 更新.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:
这怎么可能发生?我的程序承认里面有数据,但它不会出现在文件中。
更新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”替换。
我不明白这是怎么回事..