0

我做了一个序列化设置并返回包含序列化数据的 char* 的函数。

首先,我将所有值打包到 aStaticJsonDocument中,然后使用 确定输出字符串的大小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;

}
4

1 回答 1

1
char out[strsize];

这是函数内部的局部变量/数组configSerialize(),一旦从该函数返回就无效。

一种方法是在堆上使用newdelete分配/释放空间,但我不建议在 Arduino 上这样做。

另一种方法是char out[FIXED_SIZE];在您的函数之外使用 - 即作为全局变量。

此外,如果您打算out用作字符串指针,则需要在末尾添加一个零字节(并为该额外字节分配空间)。

于 2020-03-21T10:01:15.313 回答