Arduino JSON serialization возвращает пустую строку при сериализации в char * - PullRequest
0 голосов
/ 21 марта 2020

Я сделал функцию, которая сериализует настройки и возвращает символ *, содержащий сериализованные данные.

Сначала я упаковываю все значения в StaticJsonDocument, затем определяю размер выходной строки с помощью measureJson , затем выделяя пространство для вывода char out[strsize] и затем сериализуя данные в выделенное пространство serializeJson(doc,out,strsize)

Проблема в том, что выходная строка остается пустой по неизвестной причине.

Вещи, которые я проверял:

  • Json документ составлен правильно и фактически содержит настройки конфигурации
  • measureJson() функция правильно возвращает размер вывода и выделяется место, strsize не равно 0

Код:

char* configSerialize(bool msgpack){

  StaticJsonDocument<settsize> doc;

  JsonArray ipk = doc.createNestedArray("ip");
  JsonArray gateipk = doc.createNestedArray("gateip");
  JsonArray dnsk = doc.createNestedArray("dns");
  JsonArray mack = doc.createNestedArray("mac");

  unsigned char i;
  for(i=0;i<4;i++){
    ipk.add(ip[i]);
    gateipk.add(gateip[i]);
    dnsk.add(dns[i]);
  }
  for(i=0;i<6;i++){
    mack.add(mac[i]);
  }

  doc["subnet"] = subnet;
  doc["dhcp"] = DHCP;
  doc["alertbuzz"] = alertbuzz;

  const size_t strsize = msgpack ? measureMsgPack(doc) : measureJson(doc);
  char out[strsize];

  if(msgpack) serializeMsgPack(doc,out,strsize);
  else serializeJson(doc,out,strsize);

  return out;

}

1 Ответ

1 голос
/ 21 марта 2020
char out[strsize];

Это локальная переменная / массив внутри вашей функции configSerialize(), которая недействительна после возврата из этой функции.

Одним из способов будет использование new и delete для выделения / освобождает место в куче, но я не рекомендовал бы это для Arduino.

Другим способом было бы использование char out[FIXED_SIZE]; вне вашей функции - т.е. в качестве глобальной переменной.

Также, если вы планируете использовать out в качестве указателя строки, вам необходимо добавить нулевой байт в конце (и выделить место для этого дополнительного байта).

...