Официальный сайт компании Arduino по адресу arduino.cc
Вопрос по 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 на английском ничего понять не смог - слаб в языках :( .
Пометится свободной.