首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从EEPROM读取字符串时ArduinoJson解析失败

从EEPROM读取字符串时ArduinoJson解析失败
EN

Stack Overflow用户
提问于 2018-07-11 00:19:40
回答 0查看 862关注 0票数 1

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

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)中。

代码语言:javascript
复制
#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");
  }
}
EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51270065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档