Serielle Datenübertragung int übertragen

Hallo zusammen

Ich bin neu beim Arduino programmieren, nun habe ich ein problem bei der Datenübertragung.
Ich möchte mehrere integer übertragen.

Sender:

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

void loop() {

  Serial.print("A");
  Serial.print(",");
  Serial.print("1234");
  //Serial.print(",");
  Serial.print("B");
  Serial.print(",");
  Serial.print("56789");
  //Serial.print(",");
  Serial.println();

}

Empfänger:

int wert1 = 0;
int wert2 = 0;
int wert3 = 0;
int wert4 = 0;
char AnfangsBuchstabe;

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

void loop() {
 if(Serial.available()<=0);
  {
    AnfangsBuchstabe=Serial.read();
    
    if (AnfangsBuchstabe=='A')
    {
      while(Serial.available()<=0);
      AnfangsBuchstabe=Serial.read();
      
      if (AnfangsBuchstabe==',')
      {
         wert1=Serial.parseInt();
      }
    }
    
    if (AnfangsBuchstabe=='B')
    {
      while(Serial.available()<=0);
      AnfangsBuchstabe=Serial.read();
      
      if (AnfangsBuchstabe==',')
      {
        wert2=Serial.parseInt();
      }
    }
  }   

  
  Serial.print("A");
  Serial.print(",");
  Serial.print(wert1);
  Serial.print("B");
  Serial.print(",");
  Serial.print(wert2);
  Serial.println();
    
}

Nun sollte wert1=1234 und wert2=56789 sein.
Der Empfänger schreibt in die Integer immer zufällig ändernde Werte.

Ich vermute ich hab was grundsätzliches nicht verstanden

Als Hardware habe ich 2 Arduino NanoV3

Martin82: Ich möchte mehrere integer übertragen.

Und?

Ist im Internet oder gar in diesem Forum noch niemals etwas in der Richtung besprochen worden?

Du mußt die erhaltenen Zeichen in ein array schreiben, mit 0 abschließen und mit ATOI zu einer Zahl umwandeln.

oder Du teilst das int in 2 byte und überträgst die beiden Byte und stellst sie wieder zusammen:

Sender: Hbyte = int/256 Lbyte = int%256

Empfänger: int = Hbyte *256 + Lbyte

Grüße Uwe

Der Empfänger schreibt in die Integer immer zufällig ändernde Werte.
Ich vermute ich hab was grundsätzliches nicht verstanden

Das erste glaub ich nicht, beim zweiten bin ich mir ziemlich sicher dass deine Vermutung richtig ist.

 if(Serial.available()<=0);
  {

Das ist sehr verwirrend geschrieben und macht wohl nicht das was du willst:

Falls kein Zeichen da ist führe eine Leere Operation aus " ; " , sonst mach nichts. :wink:
Die Klammer danach hat mit dem if nichts mehr zu tun …

Du meinst evtl:

 if(Serial.available() > 0)
  {

56789 passt nicht in ein int. Was parseInt in dem Fall macht, könnte man im Prinzip ausprobieren, ist aber wohl nicht hilfreich. Ich nehme an, das sind nur Spassdaten und du kannst das auch mit Werten < 32767 ausprobieren.

Der Ansatz ist sehr schlecht und extrem langsam.

Man kann es bequem so machen: http://forum.arduino.cc/index.php?topic=286740.msg2008167#msg2008167 Da wird einfach entlang von Kommas geteilt und nacheinander in ein Array geschrieben. Also so senden: "123,456,789". Und am eine ein Linefeed schicken.

Aber man kann auch einfach jede Zahl einzeln mit einem Linefeed abschließen. Dann kann einen Buchstaben wie 'A' oder 'B' voranstellen. Den kann man vergleichen und in eine bestimmte Variable schreiben. Die Einlese-Funktion bleibt gleich und man ändert nur die Parse-Funktion, z.B. so:

void parseSerial()
{
  switch(serialBuffer[0])
  {
     case 'A':
       varA = atoi(serialBuffer + 1);
       break;
     case 'B':
       varB = atoi(serialBuffer + 1);
       break;
  }
}

Das geht wenn man es so schickt:

Serial.print("A"); Serial.println(1234);
Serial.print("B"); Serial.println(7896);

Man braucht dann nicht per Komma zu trennen und braucht dadurch kein strtok(). Und der Puffer muss auch nicht so groß sein.

Eine etwas exotischere Variante ist ein Zustands-Automat. Ist aufwendiger zu programmieren, aber sie eignen sich sehr gut als Parser.

Danke für die Lösungsvorschläge

Das Problem lag wohl beim serial available.

Habs jetzt folgendermaßen:

Sender

int wert1 = 1234;
int wert2 = 5678;


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

void loop() {

Serial.print("A,");
Serial.print(wert1);
Serial.println(",");
Serial.flush(); // alles uebertragen? Loesche seriellen Puffer//Serial.print(",");
    
Serial.print("B,");
Serial.print(wert2);
Serial.println(",");
Serial.flush(); // alles uebertragen? Loesche seriellen Puffer//Serial.print(",");
}

Empfänger:

int wert1 = 0;
int wert2 = 0;
char zeichenStart;

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

void loop() {
 while (Serial.available() > 0) // wenn Daten empfangen
  {
    zeichenStart = Serial.read(); // wenn Startzeichen (Header)
    switch (zeichenStart)
    {
      case 'A' : wert1 = Serial.parseInt(); break; // wenn A wird der folgende wert in den int wert1 übertragen
      case 'B' : wert2 = Serial.parseInt(); break; 
      case 'C' : wert1 = Serial.parseInt(); break; 
      case 'D' : wert1 = Serial.parseInt(); break; 
      case 'E' : wert1 = Serial.parseInt(); break; 
      case 'F' : wert1 = Serial.parseInt(); break; 
      case 'G' : wert1 = Serial.parseInt(); break; 
      case 'H' : wert1 = Serial.parseInt(); break; 
      case 'I' : wert1 = Serial.parseInt(); break; 
      case 'J' : wert1 = Serial.parseInt(); break; 
      case 'K' : wert1 = Serial.parseInt(); break; 
      case 'L' : wert1 = Serial.parseInt(); break; 
      default: break;
    }
  }

  Serial.print("A,");
  Serial.print(wert1);
  Serial.print("B,");
  Serial.print(wert2); 
  Serial.println();
    
}

Funktioniert und ich kanns erweitern. Und das wichtigste:

;D ICH HABS KAPIERT!! ;D

Danke euch allen