Zahl per SoftwareSerial an 2. Uno übergeben.....

Hallo und einen guten Morgen,

gestern Abend bin ich verzweifelt ins Bett gefallen... ich habe es nicht hinbekommen. Ich möchte, per SoftwareSerial, von einem Uno zum anderen die aktuelle Leistung meiner PV übergeben.

Der Sender-Uno schickt per: mySerial.println(watt); einen Wert von 0 - 9999 an den zweiten Uno.

Dort kommt meist auch der Wert an... jedoch immer wieder mit Fehler, Sonderzeichen oder fehlenden Ziffern.

Da ich schon diverse Beispiele ausprobiert habe, möchte ich mich jetzt an Euch wenden.

Der Empfänger-Uno sieht so aus:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10,11);
int i;
char X_buffer[5];
int watt;

void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop()
{
  i=0;
 if (mySerial.available())
    {
 
     while (i < 4)
      {
        X_buffer[i] = mySerial.read();
       delay (1);
       Serial.print(X_buffer[i]);
        i++; 
      }
    // watt = ???? //hier soll der empfange Wert gespeichert werden
    }  

}

Wie kann ich relativ sicher, die X_buffer empfangen und dann in eine Integer umwandeln....

Danke!

Viele Grüße
Tom

Du mußt als letzes Element des Arrays eine null schreiben und dann mit atoi.
Grüße Uwe

jedoch immer wieder mit Fehler, Sonderzeichen oder fehlenden Ziffern

Probier mal 4800 Bd.

... ausserdem sicherstellen, dass du nicht zu schnell liest:

delay (1); // könnte bei 9600 knapp sein

Wenn der Leser nicht viel zu tun hat sonst, mit delay(10); liegst du auf der sicheren Seite bei 4800

Versuch's mal so. Delays einzubauen, um nicht zu schnell zu lesen, ist eine dumme Idee. Besser ist warten, bis die gewünschte Anzahl erreicht ist oder gleich einen sauberen Parser zu bauen, der jedes empfangene Zeichen gleich interpretiert.

void loop()
{
  i=0;
  if (mySerial.available() >= 4) {
 
   while (i < 4) {
      X_buffer[i] = mySerial.read();
      Serial.print(X_buffer[i]);
      i++; 
    }
   // watt = ???? //hier soll der empfange Wert gespeichert werden
  }  
}

Du solltest Dir auch überlegen, wie Du synchronisierst, also Start- bzw. Stopp-Zeichen einbauen, damit Du weisst, wo eine Zahl oder ein Kommando beginnt und wo es endet.

Delays einzubauen, um nicht zu schnell zu lesen, ist eine dumme Idee. Besser ist warten, bis die gewünschte Anzahl erreicht ist oder gleich einen sauberen Parser zu bauen, der jedes empfangene Zeichen gleich interpretiert.

Wenn man die "gewünschte Anzahl" kennt, hast du recht. Meist gibt es ja auch ein Stop-Zeichen ( NewLine oder so )

Wenn nicht, und das einzige was man weiss ist, dass die Daten "am Stück" kommen, ist ein passendes kleines Delay zumindest einfach, und wenn der Uno sonst nicht viel zu tun hat, auch nicht so dumm dass man sich deswegen schämen müsste.