Вопрос по ArduinoJson

Oleg_N
Offline
Зарегистрирован: 21.12.2020

Здравствуйте! Пожалуйста, помогите новичку разобраться! Пишу скетч для 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 создавать новый буфер и хранить все это в памяти? Разъясните, пожалуйста что я сделал не так? 


 

 

rkit
Offline
Зарегистрирован: 23.11.2016

Выделить память под переменные

char ssid[32];

и копировать данные, а не просто передавать ссылку на буфер.

strcpy(ssid, doc["ssidName"]);

Oleg_N
Offline
Зарегистрирован: 21.12.2020

Спасибо. Я несколько некорректно построил вопрос. Мне важнее понять,  если и не читать других файлов   этой же функцией, буфер в стеке будет храниться постоянно, или эта область памяти пометится свободной после выхода из функции, ведь буфер объявлен внутри функции? Из документации по ArduinoJson 6 на английском ничего понять не смог - слаб в языках :( .

rkit
Offline
Зарегистрирован: 23.11.2016

Пометится свободной.