我正在使用 Arduino ESP8266 在 SPIFSS 上存储和加载配置设置。我使用这个 ConfigFile.ino 作为引用示例。

https://github.com/esp8266/Arduino/blob/master/libraries/esp8266/examples/ConfigFile/ConfigFile.ino

此函数将配置设置加载到变量 serverNameaccessToken 上。

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);

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

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

  const char* serverName = json["serverName"];
  const char* accessToken = json["accessToken"];

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

  Serial.print("Loaded serverName: ");
  Serial.println(serverName);
  Serial.print("Loaded accessToken: ");
  Serial.println(accessToken);
  return true;
}

我对这个函数做了一些修改,以将配置设置加载到一个结构中。
struct ConfigSettingsStruct
{
    String ssid;
    String password;
};

ConfigSettingsStruct ConfigSettings;

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);

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

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

    //const char* serverName = json["serverName"];
    //const char* accessToken = json["accessToken"];

    char ssid_[30];
    strcpy(ssid_, json["ssid"]);
    ConfigSettings.ssid = String(ssid_);

    char password_[30];
    strcpy(password_, json["password"]);
    ConfigSettings.password = String(password_);

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

    Serial.print("Loaded ssid: ");
    Serial.println(ConfigSettings.ssid);
    Serial.print("Loaded password: ");
    Serial.println(ConfigSettings.password);

    return true;
}

在我下载代码并运行 ESP8266 后,WiFi 芯片因堆栈错误而重置。我的代码有什么问题?如何将配置设置正确加载到 ConfigSettings 上?

最佳答案

您在问题中的代码没有任何问题。它应该工作。我强烈怀疑堆栈错误的原因在于其他地方。请再次仔细检查您的代码。

这不算作答案,但有助于提醒您去别处寻找。你可能看错地方了。

关于c++ - 在 Arduino ESP8266 上加载配置参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39597982/

10-11 19:08