Senden mehrerer Daten zwischen den beiden NodeMCU über serielle Kommunikation

Ich arbeite an der Kommunikation zwischen den beiden NodeMCUs basierend auf dem seriellen Kommunikationsprotokoll. Ich habe die SoftwareSerial- und ArduinoJson-Bibliothek für mein Programm gemäß einigen Quellen im Internet verwendet. Das Problem liegt an der Stabilität des Lesewerts von Serial. Was ich auf dem COM-Monitor gesehen habe, war entweder ein Mangel an Daten oder ein seltsamer Buchstabe. Ich möchte, dass die beiden Knoten Daten voneinander senden und empfangen können, aber die Instabilität hat mich in der ersten Richtung aufgehalten. Jedermanns Hilfe wird geschätzt. Ich versuche, UART wegen seiner Einfachheit und Geschwindigkeit anzuwenden, aber der Vorschlag einer anderen Lösung mit anderen Protokollen wäre großartig. Der Code des sendenden Knotens und des empfangenden Knotens wurde unten angehängt:

Das sendende Programm

#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);
}

Das empfangende Programm

#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);
}

Geben Sie hier die Bildbeschreibung ein

Ich denke, der Versuch, eine softwarebasierte asynchrone serielle Kommunikationsverbindung mit 115 kBaud zu verwenden, ist von Natur aus eine schlechte Idee. Reduzieren Sie entweder die Baudrate auf etwa 9600 Baud oder verwenden Sie eine hardwarebasierte Kommunikation.
Ich werde daran denken. Ich plane, das I2C-Protokoll als Empfehlung aus der folgenden Antwort zu verwenden. Halten Sie das für eine gute Alternativlösung?
Sie haben nicht genug Informationen gegeben, um ein Urteil über "gute" Ansätze zu fällen. Wenn Sie Temperaturdaten senden, sind 2400 Baud nicht schnell genug?
Ihr Code ergibt keinen Sinn, daher haben Sie hier derzeit keine spezifische beantwortbare Frage. Die serielle Kommunikation zwischen MCUs ist Routine, erfordert jedoch ziemlich ausgefeilte Programmierkenntnisse, um korrekt zu funktionieren. Wenn irgend möglich, werden Sie es viel einfacher finden, alles in einer MCU zu halten.
@Chris Stratton Könnten Sie auf das Problem mit meinem Code hinweisen? Warum macht es keinen Sinn? Ich dachte, es ist eher ein unangemessener Faktor, um stabil zu sein, als völlig falsch, nicht wahr? Ich beabsichtige, gesammelte analoge und digitale Daten einander zuzusenden. Könnten Sie mir einen Hinweis geben, um den Code anzupassen oder durch neuen Code zu ersetzen? Danke schön.

Antworten (1)

Sie sollten einen String oder ein char-Array in die angeben

  JsonObject& root = jsonBuffer.parseObject(s);

Die s-Variable ist hier ein Objekt für die SoftwareSerial-Bibliothek.

Sie müssen zuerst die Seriennummer wie lesen

while(s.available()){

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

Hier ist r ein rohes JSON-Array und das JSON-Objekt analysiert es. Und es ist gut, wenn Sie Ihre Ausgabe hochladen, um zu verstehen und zu sehen, was wirklich vor sich geht

Aktualisieren:

Die Verwendung von UART mit 115200 Baudrate ohne Verzögerung und mit Überbrückungskabeln kann dazu führen, dass die Zeichen fehlen.

Das andere Problem ist, dass dies möglicherweise auf die gleichzeitige Überwachung des seriellen Anschlusses zurückzuführen ist. Vielleicht können Sie es debuggen, indem Sie einfach auf die digitalen Pins schauen, die Sie steuern, um zu verstehen, dass Ihr Code gut funktioniert oder nicht. Sie können

Oder Sie können die I2c-Kommunikation ausprobieren, die anstelle von UART synchron und zuverlässiger und schneller ist.

Tatsächlich ist die SoftwareSerial-Bibliothek etwas langsamer als die eigentliche serielle Schnittstelle.

Ich habe gerade Ihre Anleitung befolgt, den LED-Status zu betrachten, aber er variierte so ähnlich wie die Änderung der Lesedaten auf dem Monitor. Außerdem überlege ich vorerst auf I2C umzusteigen.