我正在使用Arduino ESP8266在SPIFSS上存储和加载配置设置。我使用此ConfigFile.ino作为参考示例。
https://github.com/esp8266/Arduino/blob/master/libraries/esp8266/examples/ConfigFile/ConfigFile.ino
此功能将配置设置加载到变量serverName
和accessToken
。
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
?
答案 0 :(得分:2)
问题中的代码没有任何问题。它应该工作。我强烈怀疑堆栈错误的原因在于其他地方。请再次仔细检查您的密码。
这不算作答案,但可以提醒您去其他地方。你可能正在寻找错误的地方。
答案 1 :(得分:2)
请注意;
之后你可能有内存泄漏std::unique_ptr<char[]> buf(new char[size]);
我建议您使用malloc(这不是时尚而经典)来分配一些内存,毕竟它是免费的。您还需要在返回之前关闭文件。
此外,您的ssid和密码短语缓冲区长度还不够。最大ssid长度必须为32.假设您有基于psk的加密,则需要将传递缓冲区长度增加到64.
微小但是;也许你可以考虑在struct define之前添加一个typedef,尽管C ++线程可以在命名空间中定义。