Вопрос по ArduinoJson
- Войдите на сайт для отправки комментариев
Здравствуйте! Пожалуйста, помогите новичку разобраться! Пишу скетч для ESP8266, где из setup вызывается функция readJson(), в которой из файловой системы считывается файл конфигурации. Вот её код:
const char* readJison(String file) {
File configFile = LittleFS.open(file, "r");
if (!configFile) {
return("Failed to open config file" + file);
}
size_t size = configFile.size();
if (size > 512) {
return("Config file size is too large" + file);
}
std::unique_ptr<char[]> buf(new char[size]);
configFile.readBytes(buf.get(), size);
configFile.close();
StaticJsonDocument<512> doc;
auto error = deserializeJson(doc, buf.get());
if (error) {
return("Failed to parse config file" + file);
}
ssid = doc["ssidName"];
password = doc["ssidPassword"];
use_staticIP = doc["staticIP"];
static_ip = doc["static_ip"];
gateway = doc["gateway"];
subnet = doc["subnet"];
}
Переменные ssid и т.п. обьявлены глобально как const char*. На этом этапе работает все нормально. Но в дальнейшем, из loop() я вызываю эту же функцию для чтения другого json файла с другими ключами, после чего ssid, password и т.д. возвращают мне абракадабру. Как я понял, из-за того, что это указатели, а содержимое буфера StaticJsonDocument в стеке изменилось. То есть, поскольку этот буфер объявляется в функции, то после выхода из неё данные в нем не защищаются и они могут быть изменены в процессе работы программы в любой момент? Как избежать такого сценария, каждый раз при необходимости чтения json создавать новый буфер и хранить все это в памяти? Разъясните, пожалуйста что я сделал не так?
Выделить память под переменные
char ssid[32];
и копировать данные, а не просто передавать ссылку на буфер.
strcpy(ssid, doc["ssidName"]);
Спасибо. Я несколько некорректно построил вопрос. Мне важнее понять, если и не читать других файлов этой же функцией, буфер в стеке будет храниться постоянно, или эта область памяти пометится свободной после выхода из функции, ведь буфер объявлен внутри функции? Из документации по ArduinoJson 6 на английском ничего понять не смог - слаб в языках :( .
Пометится свободной.