0

我正在使用以下代码使用 SPIFFS 将 Config.json 文件存储到 ESP32 闪存

#include <ArduinoJson.h>
#include <FS.h>
#include<SPIFFS.h>

bool loadConfig() {
File configFile = SPIFFS.open("/Config.json", "r");
if (!configFile) {
Serial.println("Failed to open config file");
return false;
}


size_t size = configFile.size();
if (size > 1024) {
Serial.println("Config file size is too large");
return false;
}


// Allocate a buffer to store contents of the file.

std::unique_ptr<char[]> buf(new char[size]);

// We don't use String here because ArduinoJson library requires the input
// buffer to be mutable. If you don't use ArduinoJson, you may as well
// use configFile.readString instead.


configFile.readBytes(buf.get(), size);
Serial.println(buf.get());


StaticJsonBuffer<1024> jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(buf.get());


if (!json.success()) {
Serial.println("Failed to parse config file");
return false;
}

const char* ssid = json["ssid"];
const char* password = json["password"];

// Real world application would store these values in some variables for
// later use.


Serial.print("Loaded ssid: ");
Serial.println(ssid);
Serial.print("Loaded password: ");
Serial.println(password);
return true;
}


void setup() {
Serial.begin(115200);
Serial.println("");
delay(1000);
Serial.println("Mounting FS...");
if (!SPIFFS.begin()) {
Serial.println("Failed to mount file system");
return;
}




if (!loadConfig()) {
  
Serial.println("Failed to load config");

} 

else {
Serial.println("Config loaded");
}

}

void loop() {
yield();

}

但是解析失败,我在串行监视器上收到以下消息:Mounting FS...⸮xV⸮⸮⸮⸮⸮ 无法解析配置文件 无法加载配置

  • 我的 Arduino IDE 版本:1.8.13 (Windows)
  • 配置文件有 2 个对象:
    {
        "ssid": "ESP32",
        "password": "Softronics"    
      }

先感谢您

4

1 回答 1

1

无需预先分配缓冲区来存储 ArduinoJSON 文件。ArduinoJSON非常有能力读取文件本身并避免管理文件缓冲区的需要。

此代码是不必要的。您不应该分配缓冲区。

std::unique_ptr<char[]> buf(new char[size]);

// We don't use String here because ArduinoJson library requires the input
// buffer to be mutable. If you don't use ArduinoJson, you may as well
// use configFile.readString instead.


configFile.readBytes(buf.get(), size);
Serial.println(buf.get());


StaticJsonBuffer<1024> jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(buf.get());

if (!json.success()) {
Serial.println("Failed to parse config file");
return false;
}

这是一个适合我的完整程序:

#include <ArduinoJson.h>
#include <FS.h>
#include<SPIFFS.h>

bool loadConfig() {
  File configFile = SPIFFS.open("/Config.json", "r");
  if (!configFile) {
    Serial.println("Failed to open config file");
    return false;
  }


  size_t size = configFile.size();
  if (size > 1024) {
    Serial.println("Config file size is too large");
    return false;
  }

  StaticJsonDocument<1024> doc;
  DeserializationError error = deserializeJson(doc, configFile);

  if(error) {
    Serial.println("Failed to parse config file");
    return false;
  }

  const char* ssid = doc["ssid"];
  const char* password = doc["password"];

  // Real world application would store these values in some variables for
  // later use.


  Serial.print("Loaded ssid: ");
  Serial.println(ssid);
  Serial.print("Loaded password: ");
  Serial.println(password);
  return true;
}


void setup() {
  Serial.begin(115200);
  Serial.println("");
  delay(1000);
  Serial.println("Mounting FS...");
  if (!SPIFFS.begin()) {
    Serial.println("Failed to mount file system");
    return;
  }

  if (!loadConfig()) {
    Serial.println("Failed to load config");
  } 
  else {
    Serial.println("Config loaded");
  }
}

void loop() {
  yield();

}

您发布的代码适用于已过时的 ArduinoJSON 版本 5。这使用 ArduinoJSON 版本 6。您应该升级您的库以使用它。

在编写使用该库的代码时, ArduinoJSON 文档和示例非常有用。

另外,请尝试缩进您的代码,如果不是为了帮自己一个忙,至少是对他人的礼貌。适当的缩进使代码更具可读性。

于 2020-12-17T06:44:16.183 回答