问题描述
我正在编写 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
接下来,我注释掉写函数,只留下读函数。我再次运行代码,它无法读回我的文本:
有人能帮我理解为什么会这样吗?我以为如果我给 spiffs 写过一次,我之后就可以访问它,但事实并非如此。我以前使用过 EEPROM,这似乎有效。我可以写入 EEPROM 地址并稍后简单地访问相同的地址,并且断电后该值仍然存在。任何帮助表示赞赏。提前致谢。
更新1
在写入数据后,我设法从我的 SPIFFS 中读回了数据。我错过了一个关键步骤: https://randomnerdtutorials.com/install-esp32-filesystem-uploader-arduino-ide/
但是,现在,我遇到了另一个问题:
在我的项目文件夹中,我创建了一个应该由 SPIFFS 访问的文件夹“data”。在那里,我创建了 2 个文件:
- wifi.txt
- 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:
更新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”替换。
我不明白这是怎么发生的..
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)