Envío de datos múltiples entre los dos NodeMCU mediante comunicación en serie

Estoy trabajando en la comunicación entre los dos NodeMCU basándome en el protocolo de comunicación en serie. He usado la biblioteca SoftwareSerial y ArduinoJson para mi programa según algunas fuentes en Internet. El problema está en la estabilidad del valor de lectura de Serial. En cuanto a lo que vi en el monitor COM, era falta de datos o aparecía alguna letra extraña. Quiero que los dos Nodos puedan enviar y recibir datos entre sí, pero la inestabilidad me ha detenido en la primera dirección. La ayuda de cualquiera será apreciada. Estoy tratando de aplicar UART por su simplicidad y velocidad, pero la sugerencia de otra solución con otros protocolos sería excelente. A continuación se adjunta el código del nodo transmisor y del nodo receptor:

El programa de envío

#include <ArduinoJson.h>
SoftwareSerial s(D5,D6);
byte C1;
void setup() {

  pinMode(D0,OUTPUT);
s.begin(115200);
}
 

void loop() {
 

  //Sending code
   StaticJsonBuffer<1000> jsonBuffer;
  JsonObject& root = jsonBuffer.createObject();
  root["Temp"] = 100;
  
if(s.available()>0)
{
 root.printTo(s);
}

El programa receptor

#include <SoftwareSerial.h>
SoftwareSerial s(D6,D5);
#include <ArduinoJson.h>
 
void setup() {
  // Initialize Serial port
  Serial.begin(115200);
  pinMode(D0,OUTPUT);
  s.begin(115200);
  while (!Serial) continue;
 
}
 
void loop() {
 
 //Receiving code
StaticJsonBuffer<1000> jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(s);
  
  if (root == JsonObject::invalid())
    return;
 
  root.prettyPrintTo(Serial);
  Serial.print("Data 1 ");
  Serial.println("");
  int data1=root["Temp"];
  if(data1==100)
  digitalWrite(D0,HIGH);
  else
  digitalWrite(D0,LOW);
  delay(100);
}

ingrese la descripción de la imagen aquí

Creo que tratar de usar un enlace de comunicaciones en serie asíncrono basado en software a 115 kbaudios es una idea inherentemente mala. Reduzca la velocidad en baudios a algo así como 9600 baudios o use una comunicación basada en hardware.
Lo pensaré. Planeo ir con el protocolo I2C como recomendación de la respuesta a continuación. ¿Crees que es una buena alternativa de solución?
No ha proporcionado suficiente información para emitir un juicio sobre los "buenos" enfoques. Si está enviando datos de temperatura, ¿no es lo suficientemente rápido a 2400 baudios?
Su código no tiene ningún sentido, por lo que actualmente no tiene ninguna pregunta específica que responder aquí. La comunicación en serie entre MCU es rutinaria, pero requiere habilidades de programación bastante sofisticadas para hacerlo correctamente; si es posible, le resultará mucho más fácil mantener todo en una MCU.
@Chris Stratton ¿Podría señalar el problema con mi código? ¿Por qué no tiene sentido? Pensé que es inadecuado que algún factor sea estable en lugar de estar completamente equivocado, ¿no es así? Tengo la intención de enviar datos analógicos y digitales recopilados para enviarse entre sí. ¿Podría darme una pista para ajustar o reemplazar con un nuevo código? Gracias.

Respuestas (1)

Debe proporcionar una cadena o una matriz de caracteres en el

  JsonObject& root = jsonBuffer.parseObject(s);

La variable s es un objeto aquí para la biblioteca SoftwareSerial.

Primero necesitas leer la serie como

while(s.available()){

String r = s.readString();
JsonObject& root = jsonBuffer.parseObject(r);
}

Aquí r será una matriz json sin procesar y el objeto json la analizará. Y será bueno si subes tu salida para entender y ver lo que realmente está pasando.

Actualizar:

El uso de UART con 115200 baudios sin demora y con cables de puente puede causar la pérdida de caracteres.

El otro problema es que tal vez esto esté sucediendo debido a la supervisión del puerto serie al mismo tiempo. Tal vez pueda depurarlo con solo mirar los pines digitales que está controlando para comprender que su código funciona bien o no. Puede

O puede probar la comunicación I2c, que es sincrónica, más confiable y más rápida en lugar de UART.

En realidad, la biblioteca SoftwareSerial es un poco más lenta que el puerto serie real.

Simplemente seguí su guía de mirar el estado del LED, pero varió de manera similar al cambio de lectura de datos en el monitor. Además, considero cambiar a I2C por ahora.