char arry über xbee in arduino uno einlesen

hi

ich habe ein packet (char array) welches von visual basic via xbee ans arduino uno gesendet werden soll wie kann ich dieses packet empfangen und splitten

danke

Wichtig ist dass du auf dem PC ein Endzeichen schickst. Da bietet sich das Linefeed an. Oder du nimmst eine Methode die automatisch ein CR/LF sendet

Bei mehr Werten entsprechen die SERIAL_BUFFER_SIZE anpassen (min. Länge des Strings + 1) und MAX_VALUES (max. Anzahl der Werte)

danke für deine antwort also ich habe es hinbekommen das packet an dem microcontroller zu schicken ich hänge jetzt bei dem packet splitten

hast du erfahrung mit dieser strcpy funktion

leider funktioniert das nicht bei mir

#include <SoftwareSerial.h>
#include <string.h>

char Id[3], Sp[4], Dir[2], Lt[2];
char rx[18];
char data[18];

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:
if(Serial.available() > 0){

strcpy( Id, strtok(rx, “;”));
strcpy( Sp, strtok(NULL, “;”));
strcpy( Dir, strtok(NULL, “;”));
strcpy( Lt, strtok(NULL, “;”));

for(int i=0;i<18;i++){

Serial.print( data*);*

  • }*
    }
    }

Wenn die einzelnen Teile fixe längen haben dann kannst Du einfach kopieren:

char Id[3], Sp[4], Dir[2], Lt[2];
char rx[18];

Id[0] = rx[0];
Id[1] = rx[1];
Id[2] = rx[2];
Sp[0] = rx[3];
Sp[1] = rx[4];
ecc.
Grüße Uwe

Ich sehe nie dass du da mal was von der seriellen Schnittstelle einliest. Du kannst auch nicht einfach nachdem einmal available() wahr ist, gleich den kompletten String einlesen. Bei 9600 Baud dauert ein Zeichen 1ms. Deshalb fragt man immer wieder ab und liest so lange ein bis das Endzeichen da ist.

Willst du wirklich Strings speichern? Normal sendet man ja Zahlen für Variablen, Daten, etc. Strings sind i.d.R. nur ein Zwischenmedium. Diese konvertiert man dann sofort in Integer und speichert diese. Wenn du wirklich Teil-Strings in Arrays kopieren willst, passe bei der Array Länge auf. Das Array muss mindestens Platz für die Anzahl der Zeichen + 1 haben. Niemals den NULL-Terminator vergessen

Aber einfacher geht es wenn du bei Direction z.B. 0 oder 1 nimmst und dass per atoi() in einen Integer wandelst. Sp (Speed?) soll ja wohl auch eher eine Zahl sein.

Einfach so:

int sp, dir, lt;

...

ld =  ...        //muss wohl doch ein String sein
sp = atoi(strtok(NULL, ";"));
dir =  atoi(strtok(NULL, ";"));
lt =  atoi(strtok(NULL, ";"));

Aber eben erst nachdem das Endzeichen da ist! Nimm die readSerial() Funktion aus dem Link oben. Die geht auf mit SoftwareSerial. Und passe auf wie ich die in loop() aufrufe. Sie kommt ständig dran (mit der Schnittstelle als Parameter) und gibt true zurück wenn der String da ist.