Получение мусорных значений при отправке объекта Json из Arduino Uno в NodeMCU с использованием SoftwareSerial

Я пытаюсь отправить объект Json из Arduino UNO в NodeMCU с помощью SoftwareSerial. Я использую Arduino IDE. Я получаю значение мусора на последовательном мониторе NodeMCU. Пробовал с разными значениями мусора, не смог получить данные от Arduino UNO. Ниже приведен код. Пожалуйста, помогите. Заранее благодарю вас. Я не нашел общего языка. Я упомянул эту веб-страницу здесь.

Код Arduino UNO:

    #include <SoftwareSerial.h>
    #include <ArduinoJson.h>
    SoftwareSerial s(5,6);

    void setup() {
    s.begin(9600);
    }

    void loop() {
     StaticJsonBuffer<1000> jsonBuffer;
     JsonObject& root = jsonBuffer.createObject();
      root["data1"] = 100;
      root["data2"] = 200;
      if(s.available()>0)
      {
       root.printTo(s);
      }
    }

Код NodeMCU:

    #include <SoftwareSerial.h>
    SoftwareSerial s(D6,D5);
    #include <ArduinoJson.h>

    void setup() {
      // Initialize Serial port
      Serial.begin(9600);
      s.begin(9600);
      while (!Serial) continue;

    }

    void loop() {
      StaticJsonBuffer<1000> jsonBuffer;
      JsonObject& root = jsonBuffer.parseObject(s);
      if (root == JsonObject::invalid())
        return;

      Serial.println("JSON received and parsed");
      root.prettyPrintTo(Serial);
      Serial.print("Data 1 ");
      Serial.println("");
      int data1=root["data1"];
      Serial.print(data1);
      Serial.print("   Data 2 ");
      int data2=root["data2"];
      Serial.print(data2);
      Serial.println("");
      Serial.println("---------------------xxxxx--------------------");

    }

, 👍2

Обсуждение

Я не нашел общего языка. ... они, может быть, тебе должны? https://majenko.co.uk/blog/importance-sharing-grounds, @Majenko

Я тоже попытался найти общий язык, результат тот же, @Muskan Chotrani


1 ответ


Лучший ответ:

1

Проблема с ArduinoJson.h заключается в том, что он не обеспечивает надежную и надежную передачу данных по UART serial.

Вместо этого вы должны использовать SerialTransfer.h для автоматической упаковки и анализа ваших данных для взаимодействия между Arduino без заголовка.Библиотека устанавливается через Arduino IDE и включает в себя множество примеров.

Вот особенности библиотеки:

Эта библиотека:

  • можно загрузить через менеджер библиотек Arduino IDE (поиск "SerialTransfer.h").
  • работает с "программно-последовательными" библиотеками
  • является неблокирующим
  • использует разделители пакетов
  • использует последовательную начинку накладных байтов
  • использует CRC-8 (полином 0x9B с таблицей подстановки)
  • позволяет использовать пакеты динамического размера (пакеты могут иметь длину полезной нагрузки от 1 до 254 байт).
  • может передавать байты, инты, флоат и даже структуры!!

Пример скетча TX Arduino:

#include "SerialTransfer.h"

SerialTransfer myTransfer;

void setup()
{
  Serial.begin(115200);
  Serial1.begin(115200);
  myTransfer.begin(Serial1);
}

void loop()
{
  char buff[] = "hi";

  myTransfer.txObj(buff, sizeof(buff));
  myTransfer.sendData(sizeof(buff));
  delay(100);
}

Пример скетча Arduino:

#include "SerialTransfer.h"

SerialTransfer myTransfer;

void setup()
{
  Serial.begin(115200);
  Serial1.begin(115200);
  myTransfer.begin(Serial1);
}

void loop()
{
  if(myTransfer.available())
  {
    char buff[40];
    
    myTransfer.rxObj(buff, sizeof(buff));
    
    Serial.println("New Data: ");
    Serial.write(buff, sizeof(buff));
    Serial.println();
  }
  else if(myTransfer.status < 0)
  {
    Serial.print("ERROR: ");

    if(myTransfer.status == -1)
      Serial.println(F("CRC_ERROR"));
    else if(myTransfer.status == -2)
      Serial.println(F("PAYLOAD_ERROR"));
    else if(myTransfer.status == -3)
      Serial.println(F("STOP_BYTE_ERROR"));
  }
}
,

Большое вам спасибо. Это решило мою проблему. Теперь передача работает нормально., @Muskan Chotrani