Arduino json в последовательном потоке - PullRequest
0 голосов
/ 30 апреля 2020

Я использую BLuno arduino , он нормально подключается к моему iOS телефону, отправляет и получает сообщения.

Теперь я хочу использовать arduino json для анализа сообщений от моего телефон,

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

Я получаю ошибку:

десериализация Json () завершилась неудачно: InvalidInput

Код:

#include <ArduinoJson.h>
StaticJsonDocument<400> doc;
void setup() {
Serial.begin(115200); 
}

void loop()
{
  if (Serial.available() > 0)
  {
    String s = Serial.readStringUntil("#");   // Until CR (Carriage Return)
    s.replace("#", "");
    Serial.println(s);

    DeserializationError error = deserializeJson(doc, s);
    if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return;
   }
  int value = doc["value"];
Serial.println(Serial.println(value));

IS

deserializeJson(doc, s);

правильно?, Я пытаюсь отправьте с телефона разные значения:

Мне просто нужно проанализировать пару ключ-значение, но ни один из следующих способов не сработал:

{'a':'b'}

или

"{"a":"b"}"

или

{\"a\":\"b\"}

Где моя проблема, пожалуйста? как отформатировать {"a": "b"}

, чтобы сериал нравился для разбора?

1 Ответ

2 голосов
/ 30 апреля 2020

В вашем коде и методе Arduino Json нет ничего плохого,

{'a':'b'} "{"a":"b"}" {\"a\":\"b\"}

не является ни действительным JSON объектом, ни сериализованным строковым представлением объекта JSON.

Если JSON состоит из нескольких объектов, правильный формат должен быть:

[{"a": "b"},{"a": "b"},{"a": "b"}]

и с сериализованным строковым представлением должен быть таким:

"[{\"a\": \"b\"},{\"a\": \"b\"},{\"a\": \"b\"}]"

Всегда полезно использовать один из этих онлайн JSON Validator для проверки вашего JSON объекта во время разработки.

Обновление

Похоже, что вы обновили свой вопрос, основываясь на вашем обновлении, в вашем коде есть две проблемы:

  • если объект JSON равен {"a":"b"}, то в десериализованных данных нет doc["value"] , это должно быть doc["a"] для доступа к значению "b".
  • doc["a"] не будет int, как в ваших int value = doc["value"], doc["value"] возвращает указатель на char.

Здесь будет код, который выдает правильное значение.


void loop() {
  char s[] = "{\"a\":\"b\"}";
  StaticJsonDocument<200> doc;
  DeserializationError error = deserializeJson(doc, s);
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return;
  }
  const char* value = doc["a"];
  Serial.println(value);
  while(1) {};
}

...