gpt4 book ai didi

c++ - 从 EEPROM 读取字符串时 ArduinoJson 解析失败

转载 作者:行者123 更新时间:2023-11-30 04:59:19 24 4
gpt4 key购买 nike

在有人将其标记为重复之前,我已经找到了这两个链接,但它们都没有完全适用,尽管我至少实现了其中的一点点。

Buffer gets overwritten

Arduino reading json from EEPROM / converting uint8_t to char

我的问题是这样的。我正在尝试使用 ArduinoJson 库 ( https://github.com/bblanchon/ArduinoJson ) 读取 JSON 字符串并将其写入 Arduinos EEPROM。在下面的代码中,我从硬编码的 JSON 字符串生成了一个 JsonObject(这可行)。然后我将它写入 EEPROM(这有效)。然后它从 EEPROM 中读回(这有效)但是当我尝试使用 ArduinoJSON 解析第二个字符串时我遇到了解析失败。

出于测试的目的,我每次都会清除 EEPROM,以防万一,尽管最终会被删除。

代码编译没有错误。我希望比我更了解 C++ 的人会发现一些非常明显的东西。我正在将其编译到 NodeMCU (esp8266) 上。

#include <ArduinoJson.h>
#include <EEPROM.h>

StaticJsonBuffer<400> jsonBuffer;
JsonObject *jsonObject;
JsonObject *config;

String dummyJson = "{\"name\":\"RGB LED 1\",\"io\":[\"pwm1\",\"pwm2\",\"pwm3\"],\"io_type\":\"output\",\"device\":\"pwm_output\",\"uuid\":\"5a81f424aaf8d1e951ae78d270668337\",\"ip\":\"255.255.255.255\"}";

void setup()
{
Serial.begin(9600);
while (!Serial)
{
continue;
}
EEPROM.begin(512);

Serial.println("\n\n");
clearEEPROM();
createDummyJsonObject();
writeJsonToEEPROM();
readJsonFromEEPROM();
}

void createDummyJsonObject()
{
jsonObject = &jsonBuffer.parseObject(dummyJson);
if (!jsonObject->success())
{
Serial.println("jsonBuffer.parseObject() failed");
return;
}
else
{
Serial.println("JSON object generated from dummy string");
jsonObject->prettyPrintTo(Serial);
Serial.println("\n\n");
}
}

void loop()
{
// not used
}

void clearEEPROM()
{
for (int i = 0; i < 512 + 1; i++)
{
EEPROM.write(i, 0);
}
EEPROM.commit();
}

void writeJsonToEEPROM()
{
String jsonStr;
jsonObject->printTo(jsonStr);

for (int i = 0; i < jsonStr.length(); ++i)
{
EEPROM.write(i, jsonStr[i]);
}

EEPROM.write(jsonStr.length(), byte(0));
EEPROM.commit();
}

void readJsonFromEEPROM()
{
String jsonStr;

for (int i = 0; i < 512; ++i)
{
char c = char(EEPROM.read(i));
if (c != 0)
{
jsonStr += c;
delay(1);
}
else
{
break;
}
}
Serial.println(jsonStr);

char charBuf[jsonStr.length()];
jsonStr.toCharArray(charBuf, jsonStr.length());
config = &jsonBuffer.parseObject(charBuf);

if (!config->success())
{
Serial.println("jsonObject.parseObject() failed ");
return;
}
else
{
// Never reaches this point!
Serial.println("\nJSON object generated from EEPROM data");
config->prettyPrintTo(Serial);
Serial.println("\n\n");
}
}

最佳答案

分配给 charBuf 的大小应该是 jsonStr.length() + 1 因为您需要为字符串终止符留出空间。因此,您还应该添加类似 charBuf[jsonStr.length()] = '\0'; 的内容以提供该字符串终止符:

int const jsonStringLengh = jsonStr.length();
char charBuf[jsonStringLengh + 1];
jsonStr.toCharArray(charBuf, jsonStringLengh);
charBuf[jsonStringLengh] = '\0';

关于c++ - 从 EEPROM 读取字符串时 ArduinoJson 解析失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51270065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com