Gesendete Daten mit Xbee am Arduino empfangen

Hallo zusammen

Ich habe ein kleines Problem mit dem seriellen Empfang.

Vor einiger Zeit habe ich mit zwei UNOs das Senden und Empfangen über die serielle Schnittstelle versucht. Das hat eigentlich alles ohne Probleme funktionert. Für den Sende-UNO habe ich folgenden Sketch geladen:

// Only these pins works with TX/RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69)

#include <SoftwareSerial.h>

#define rxPin 10
#define txPin 11
int wert = 1023;
int wert2 = 825;
SoftwareSerial mySerial(rxPin, txPin); //RX, TX

void setup() {
  pinMode (rxPin, INPUT);
  pinMode (txPin, OUTPUT);
  mySerial.begin(9600); //300 bis 115200

}

void loop() {
  mySerial.print("A,");
  mySerial.print(wert);
  mySerial.println(",");
  mySerial.flush();

  mySerial.print("B,");
  mySerial.print(wert2);
  mySerial.println(",");
  mySerial.flush();

}

Und für den Empfangs-UNO folgenden:

int eins = 0;
int zwei = 0;
int drei = 0;
char var = 0;

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

}

void loop() {
  while(Serial.available() > 0){
    var = Serial.read();
    switch (var){
      case 'A' : eins = Serial.parseInt();
                    break;
      case 'a' : drei = Serial.parseInt();
                    break;
      case 'B' : zwei = Serial.parseInt();
                    break;
    }
  }
Serial.print("eins =");
Serial.println(eins);
Serial.print("zwei =");
Serial.println(zwei);
Serial.print("drei =");
Serial.println(drei);
  
}

Das habe ich dann erweitert für einen Controller der die Werte senden soll.

Nun sende ich Daten von Tastern und Joysticks mit folgenden Zeilen:

Serial.print('P');
Serial.println(HRUD); //für HRUD ist dann die Zahl gespeichert vom Joystick z.B. 180
Serial.flush();

Wenn Ich nun den Empfänger Xbee mit einem FTDI Adapter in den USB Anschluss am PC stecke und über den seriellen Monitor die Daten lese welche ich empfange, stimmt alles. Also empfängt der Xbee mal alles korrekt.

Sobald ich aber folgenden Testsketch auf einen UNO lade, den Xbee anschliesse und den UNO per USB am PC über den seriellen Monitor auslesen möchte, empfange ich genau nichts. Was mache ich falsch oder was ist der Grund dafür?
Hier der Testsketch:

#include <SoftwareSerial.h>

SoftwareSerial XB(10,11); //RX, TX pin

//Definition of designations for reading signals (signals to be received)
int DP1 = 0;
int DP2 = 0;  
int DP3 = 0;  
int DP4 = 0;   
int DP5 = 0;   
int DP6 = 0;   
int DP7 = 0;  
int DP8 = 0;    
int DP9 = 0;    
int DP10 = 0;  

int HFLR = 0;   
int HFUD = 0;   
int HTLR = 0;   
int HTUD = 0;  
int HRLR = 0;   
int HRUD = 0;   

int HF = 0;    
int HT = 0;     
int HR = 0;     

int BP1 = 0;   
int BP2 = 0;   
int BP3 = 0;   
int BP4 = 0;    
int BP5 = 0;   

int UAL = 0;    
int UAR = 0;    

int DD = 0;     
int FDLR = 0;   
int FDUD = 0;   
int joybut = 0; 

int BUT1 = 0;   //Button 1
int BUT2 = 0;   //Button 2
int BUT3 = 0;   //Button 3
int BUT4 = 0;   //Button 4
int BUT5 = 0;   //Button 5
int BUT6 = 0;   //Button 6
int BUT7 = 0;   //Button 7
int BUT8 = 0;   //Button 8
int BUT9 = 0;   //Button 9
int BUT10 = 0;  //Button 10
int BUT11 = 0;  //Button 11
int BUT12 = 0;  //Button 12
int BUT13 = 0;  //Button 13
int BUT14 = 0;  //Button 14
int BUT15 = 0;  //Button 15
int BUT16 = 0;  //Button 16
int BUT17 = 0;  //Button 17
int BUT18 = 0;  //Button 18
int BUT19 = 0;  //Button 19
int BUT20 = 0;  //Button 20
int BUT21 = 0;  //Button 21
int BUT22 = 0;  //Button 22
int BUT23 = 0;  //Button 23

int autobut = 0;  //Automatic button

 //Definition of designations for storing signals (cache)
char var = 0;       //reads the letter from serial

void setup() {
  XB.begin(38400);
  Serial.begin(19200);

  pinMode(10, INPUT);
  pinMode(11, OUTPUT);

}

void loop() {

  while(XB.available() > 0){                        //while serial is available, make...
    var = Serial.read();                                //store first character from serial to var
    switch(var){                                        
      case 'A' : DP1 = Serial.parseInt();               //if var is equal to A, then store second character from serial to DP1
                 Serial.print("DP1");
                 Serial.println(DP1);
                 break;                                 //finish the command and return
      case 'B' : DP2 = Serial.parseInt();
                 Serial.print("DP2");
                 Serial.println(DP2);
                 break;
      case 'C' : DP3 = Serial.parseInt();
                 Serial.print("DP3");
                 Serial.println(DP3);
                 break;
      case 'D' : DP4 = Serial.parseInt();
                 Serial.print("DP4");
                 Serial.println(DP4);
                 break;
      case 'E' : DP5 = Serial.parseInt();
                 Serial.print("DP5");
                 Serial.println(DP5);
                 break;
.... usw.
      
    }
  }

  }

Grüsse

Stef

Hallo,

Das hier

  pinMode(10, INPUT);
  pinMode(11, OUTPUT);

kannst du dir sparen, das macht die Library SoftwareSerial.
Und wenn du SoftwareSerial verwendest, musst du die auch lesen und nicht Serial.

Ok. Wusste ich gar nicht, dass man die Input und Output hier nicht definieren muss. Ist ja aber auch nicht schlimm nehme ich an, sprich passieren tut nix :wink:
Aber gut zu wissen, danke!

Oh man... Danke! Werde ich morgen gleich mal korrigieren und testen. Dann sollte es ja gehen sofern nicht noch was anderes ist. Ist schon spät, resp. hatte ich wenig Schlaf die letzte Zeit, das merkt man dann irgendwann...

P.S. stimmt das, dass die Pins 29, 30, 31, 32 vom Mega nicht für Software Serial genutzt werden können?

Hallo stef,

ich habe mal gegoogelt und diesen Thread gefunden.

SoftSerial Baudraten - was geht wirklich?

Stammt aus 2014. Möglicherweise hat sich da in der Zwischenzeit etwas getan.
probiere es mal mit niedrigeren Baudraten.

In dem Thread wird geschrieben, dass gleichzeitiger Dauer-Empfang mit hardware-serial die software-serial behindert.

Für einen Funktionstest an sich könntest du ja auch eine LED blinken lassen. Wenn Zeichenfolge xy empfangen dann LED an/aus

Mit ESP8266 bzw. ESP32-Boards kann man das ESP-NOW-Protokoll benutzen das ist sehr schnell.

ESP8266 gibt es hier für schlappe 4 Euro

ESP8266 ESP-12 USB WeMos D1 Mini WiFi Development Board

Und hier einfach nur die Hauptseite des Shops

Dann mit der Suchfunktion des Shops nach Wemos D1 suchen

Takt 80 MHz, 32kB RAM, 1Mbyte Flash-Rom

viele Grüße Stefan

stef308:
Ok. Wusste ich gar nicht, dass man die Input und Output hier nicht definieren muss. Ist ja aber auch nicht schlimm nehme ich an, sprich passieren tut nix :wink:
Aber gut zu wissen, danke!

Ist nicht schlimm, aber man spart Speicher.

stef308:
P.S. stimmt das, dass die Pins 29, 30, 31, 32 vom Mega nicht für Software Serial genutzt werden können?

Der Mega hat 3 (freie) Hardware-Serielle, da brauchst du kein SoftwareSerial.

Edit:
geändert und (frei) hinzugefügt.

Stefan, dein Link funktionert nicht.

Und SoftwareSerial funktioniert bei 38400 Bd problemlos.
Läuft bei mir seit einigen Jahren.

Hallo Dieter,

hm merkwürdig wenn ich die url mit allem drum und dran per copy & paste in den browser einfüge klappt es.
Könnte es sein dass es bei mir klappt weil das irgendwelche cookies im Hintergrund mitwirken?
Ich habe jedenfalls die Hauptseite angegeben und wie das Produkt heißt damit kann man es jetzt suchen
viele Grüße Stefan

Sorry, ich meinte den mit SoftwareSerial.

Hallo zusammen

@Stefan: Ich muss heute Abend mal am PC schauen, erster Link funktioniert nicht mit dem Handy. Aber wie Dieter auch schon sagte, bis 38400b/s habe ich auch schon getestet und funktioniert ohne Probleme. Aber interessiert mich trotzdem mal was da steht :slight_smile:

@Dieter: Ja, das mit dem Speicher stimmt auch wieder, ist in diesem Fall aber kein Problem, habe nur 16% gefüllt. Aber falls mal was dazukommt ist es bestimmt eine gute Sache das rauszuschmeissen! Danke Dir!
Und das mit den Hardware seriellen stimmt schon, aber die habe ich schon in Gebrauch und bräuchte noch zwei serielle ports. Da dachte ich an Software Serielle. Hab eben gar nicht mehr dran gedacht, dass nach Angabe nur die ganz oben in meinem Sketch aufgelisteten Pins funktionieren sollen. Hat mich daher gewundert, ob dem wirklich so ist und weshalb?

Ich nehme an, Stefan meint diesen Link .

Der Mega hat 3 Hardware-Serielle, da brauchst du kein SoftwareSerial.

Nein. Der Mega hat 4 serielle Schnittstellen wovon 3 zur freien Verfügung stehen. Die fehlende (erste) wird für die USB Verbindung mit dem PC verwendet und steht darum nur bedungt zur Verfügung.

Zusammenfassend: Er hat 4 aber 3 kannste problemlos verwenden.
Grüße Uwe

uwefed:
Der Mega hat 4 serielle Schnittstellen wovon 3 zur freien Verfügung stehen.

Stimmt ja, habe ich noch ergänzt.

Das ist richtig mit den vier seriellen Schnittstellen, doch ich brauche noch drei weitere um Befehle an LED Displays zu senden. Darum nimmt es mich wunder, ob wirklich nur die vorgegebenen Pins funktionieren oder z.B. Pin 28-33 auch!?

stef308:
Das ist richtig mit den vier seriellen Schnittstellen, doch ich brauche noch drei weitere um Befehle an LED Displays zu senden. Darum nimmt es mich wunder, ob wirklich nur die vorgegebenen Pins funktionieren oder z.B. Pin 28-33 auch!?

Was für Led-Displays ?
Und wie schon geschrieben, kannst du sehr viele der digitalen Pins für SoftwareSerial verwenden.
Welche beim Mega nicht funktionieren, findest du sicher im Datenblatt oder einfach nur ausprobieren.

Aber denke dran, mit so vielen seriellen Schnittstellen wird das nicht einfacher.

Alles klar, werde ich dann einfach mal versuchen :wink:

Nun zurück zu meinem Empfangssketch… Ich habe nun Serial.read in XB.read geändert und die zwei INPUT resp. OUTPUT rausgenommen. Sieht jetzt so aus:

#include <SoftwareSerial.h>

SoftwareSerial XB(10,11); //RX, TX pin

//Definition of designations for reading signals (signals to be received)
int DP1 = 0;
int DP2 = 0; 
int DP3 = 0; 
int DP4 = 0;   
int DP5 = 0;   
int DP6 = 0;   
int DP7 = 0; 
int DP8 = 0;   
int DP9 = 0;   
int DP10 = 0; 

int HFLR = 0;   
int HFUD = 0;   
int HTLR = 0;   
int HTUD = 0; 
int HRLR = 0;   
int HRUD = 0;   

int HF = 0;   
int HT = 0;     
int HR = 0;     

int BP1 = 0;   
int BP2 = 0;   
int BP3 = 0;   
int BP4 = 0;   
int BP5 = 0;   

int UAL = 0;   
int UAR = 0;   

int DD = 0;     
int FDLR = 0;   
int FDUD = 0;   
int joybut = 0;

int BUT1 = 0;   //Button 1
int BUT2 = 0;   //Button 2
int BUT3 = 0;   //Button 3
int BUT4 = 0;   //Button 4
int BUT5 = 0;   //Button 5
int BUT6 = 0;   //Button 6
int BUT7 = 0;   //Button 7
int BUT8 = 0;   //Button 8
int BUT9 = 0;   //Button 9
int BUT10 = 0;  //Button 10
int BUT11 = 0;  //Button 11
int BUT12 = 0;  //Button 12
int BUT13 = 0;  //Button 13
int BUT14 = 0;  //Button 14
int BUT15 = 0;  //Button 15
int BUT16 = 0;  //Button 16
int BUT17 = 0;  //Button 17
int BUT18 = 0;  //Button 18
int BUT19 = 0;  //Button 19
int BUT20 = 0;  //Button 20
int BUT21 = 0;  //Button 21
int BUT22 = 0;  //Button 22
int BUT23 = 0;  //Button 23

int autobut = 0;  //Automatic button

 //Definition of designations for storing signals (cache)
char var = 0;       //reads the letter from serial

void setup() {
  XB.begin(38400);
  Serial.begin(19200);

}

void loop() {

  while(XB.available() > 0){                        //while serial is available, make...
    var = XB.read();                                //store first character from serial to var
    switch(var){                                       
      case 'A' : DP1 = Serial.parseInt();               //if var is equal to A, then store second character from serial to DP1
                 Serial.print("DP1");
                 Serial.println(DP1);
                 break;                                 //finish the command and return
      case 'B' : DP2 = Serial.parseInt();
                 Serial.print("DP2");
                 Serial.println(DP2);
                 break;
      case 'C' : DP3 = Serial.parseInt();
                 Serial.print("DP3");
                 Serial.println(DP3);
                 break;
      case 'D' : DP4 = Serial.parseInt();
                 Serial.print("DP4");
                 Serial.println(DP4);
                 break;
      case 'E' : DP5 = Serial.parseInt();
                 Serial.print("DP5");
                 Serial.println(DP5);
                 break;
.... usw.
     
    }
  }

  }

Nun empfange ich aber willkürlich Daten, die ich gar nicht empfangen kann, weil sie nicht gesendet werden. Auch wenn ich einen Taster drücke oder Joystick bewege, dann empfange ich lange nichts, und wenn dann irgendwann mal was ankommt, dann immer der Wert 0 hinter dem Buchstabenkürzel wie z.B. BUT1 oder HTLR. Was kann hier das Problem sein? Mit zwei Arduinos verbunden hat mein Beispielsketch alles in gewohnter Schnelligkeit empfangen und vor allem richtig empfangen. Nur das Xbee am FTDI zeigt am seriellen Monitor auch alles korrekt und schnell an. Also liegt es irgenwie bei der Übertragung von Xbee und Arduino und was dieser aus den Daten macht.

EDIT:
Wenn man natürlich die parse Funktion mit Serial weitermacht und nicht mit dem SoftwareSerial ist auch alles verloren… :expressionless:
Hier funktioniert alles! Muss nur aufmerksam sein mit den seriellen Schnittstellen und darf nicht mischen (wie peinlich!):

#include <SoftwareSerial.h>

SoftwareSerial XB(10,11); //RX, TX pin

//Definition of designations for reading signals (signals to be received)
int DP1 = 0;
int DP2 = 0; 
int DP3 = 0; 
int DP4 = 0;   
int DP5 = 0;   
int DP6 = 0;   
int DP7 = 0; 
int DP8 = 0;   
int DP9 = 0;   
int DP10 = 0; 

int HFLR = 0;   
int HFUD = 0;   
int HTLR = 0;   
int HTUD = 0; 
int HRLR = 0;   
int HRUD = 0;   

int HF = 0;   
int HT = 0;     
int HR = 0;     

int BP1 = 0;   
int BP2 = 0;   
int BP3 = 0;   
int BP4 = 0;   
int BP5 = 0;   

int UAL = 0;   
int UAR = 0;   

int DD = 0;     
int FDLR = 0;   
int FDUD = 0;   
int joybut = 0;

int BUT1 = 0;   //Button 1
int BUT2 = 0;   //Button 2
int BUT3 = 0;   //Button 3
int BUT4 = 0;   //Button 4
int BUT5 = 0;   //Button 5
int BUT6 = 0;   //Button 6
int BUT7 = 0;   //Button 7
int BUT8 = 0;   //Button 8
int BUT9 = 0;   //Button 9
int BUT10 = 0;  //Button 10
int BUT11 = 0;  //Button 11
int BUT12 = 0;  //Button 12
int BUT13 = 0;  //Button 13
int BUT14 = 0;  //Button 14
int BUT15 = 0;  //Button 15
int BUT16 = 0;  //Button 16
int BUT17 = 0;  //Button 17
int BUT18 = 0;  //Button 18
int BUT19 = 0;  //Button 19
int BUT20 = 0;  //Button 20
int BUT21 = 0;  //Button 21
int BUT22 = 0;  //Button 22
int BUT23 = 0;  //Button 23

int autobut = 0;  //Automatic button

 //Definition of designations for storing signals (cache)
char var = 0;       //reads the letter from serial

void setup() {
  XB.begin(38400);
  Serial.begin(19200);

}

void loop() {

  while(XB.available() > 0){                        //while serial is available, make...
    var = XB.read();                                //store first character from serial to var
    switch(var){                                       
      case 'A' : DP1 = XB.parseInt();               //if var is equal to A, then store second character from serial to DP1
                 Serial.print("DP1");
                 Serial.println(DP1);
                 break;                                 //finish the command and return
      case 'B' : DP2 = XB.parseInt();
                 Serial.print("DP2");
                 Serial.println(DP2);
                 break;
      case 'C' : DP3 = XB.parseInt();
                 Serial.print("DP3");
                 Serial.println(DP3);
                 break;
      case 'D' : DP4 = XB.parseInt();
                 Serial.print("DP4");
                 Serial.println(DP4);
                 break;
      case 'E' : DP5 = XB.parseInt();
                 Serial.print("DP5");
                 Serial.println(DP5);
                 break;
.... usw.
     
    }
  }

  }