Also, mal vorweg: Ich weiss was ich brauche, aber es spielt überhaupt keine Rolle, ob der Sketch nun einen Wert von nur 1 oder 1023 senden muss. Ich habe am Anfang irgendwo erwähnt, dass ich Taster (LOW, HIGH, also 0 und 1) und Joysticks (Werte von 0 bis 1023) verwenden will die die Werte an einen anderen Arduino senden.
Ich habe den einfachen Sketch wo ich einfach alle Werte am Ende der Loop mit Serial.write nacheinander sende und beim Empfänger in ein Array ornde und somit in der gleichen Reihenfolge wieder empfange. Jetzt habe ich mal den Sketch vom Anfang mit Buchstaben im "case" geändert, anstatt mit Wörtern. Jetzt klappt das Senden und Empfangen, von "bestimmten" und nicht allen Werten erfolgreich, und werden mit der switch/case auch wieder erfolgreich einsortiert. Das Funktioniert aber nur mit Zahlen und Buchstaben. Theoretisch habe ich gelesen, dass es auch mit HEX Werten gehen soll, aber wenn ich z.B. unter
case 0x7E:
schreibe, anstatt
case 'A':
, dann empfängt er diesen Teil wo eigentlich nach dem 0x7E kommt nicht. Hier ist der funktionierende Sketch mit Switch/Case:
Sender:
int wert = 1023;
int wert2 = 825;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("A,");
Serial.print(wert);
Serial.println(",");
Serial.flush();
Serial.print("B,");
Serial.print(wert2);
Serial.println(",");
Serial.flush();
}
Empfänger:
int eins = 0;
int zwei = 0;
char var;
void setup() {
Serial.begin(9600);
}
void loop() {
while(Serial.available() > 0){
var = Serial.read();
switch (var){
case 'A' : eins = Serial.parseInt();
break;
case 'B' : zwei = Serial.parseInt();
break;
}
}
Serial.print("eins =");
Serial.println(eins);
Serial.print("zwei =");
Serial.println(zwei);
}
Jetzt habe ich mal versucht ein Beispiel zu verstehen und habe es ein wenig angepasst und meiner Meinung nach fehlende Teile ergänzt. Mit diesem Sketch und dem Parser strtok empfange ich mal die gesendeten z.B. 7E als Dezimalwert 126 oder 89 als 137. Das Problem hier ist noch, dass ich die Werte nicht alle erhalte, meistens nur die ersten fünf bis zum A (A auch als Dezimalwert = 10) und mit der Zeit stimmt die Reihenfolge, resp. auch die Werte die in die Arrays gehen nicht mehr mit dem gesendeten überein. Ich sehe da nur ein "Problem", dass die if Bedingung im readSerial() wohl einen Fehler haben muss und die empfangenen Daten nicht richtig speichert, resp. zu früh oder spät überschreibt. Hier mal den Sketch den ich versucht habe zu verstehen und anzupassen:
Sender:
int wert = 1023;
int wert2 = 825;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("7E");
Serial.print(',');
Serial.print("89");
Serial.print(',');
Serial.print("00");
Serial.print(',');
Serial.print("01");
Serial.print(',');
Serial.print("A,");
Serial.print(wert);
Serial.print(',');
Serial.print("B,");
Serial.print(wert2);
Serial.println(';');
Serial.flush();
}
Empfänger:
const int SERIAL_BUFFER_SIZE = 20; //Speicher für 20 gesendete Werte
char serialBuffer[SERIAL_BUFFER_SIZE]; //Array serialBuffer
byte key[8]; //Array key mit 8 Elementen
int arraySize = sizeof(key)/sizeof(key[0]); //Anzahl Elemente im Array key
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (readSerial())
{
parseSerial();
for (int i = 0; i < arraySize; i++){ //wenn i kleiner als Anzahl Elemente im Array key, i+1...
Serial.print("key ");
Serial.print(i);
Serial.print(" = ");
Serial.println(key[i]); //zeige Array i
Serial.println();
}
}
}
bool readSerial()
{
static byte index;
while (Serial.available())
{
char c = Serial.read();
if (c >= 1 && index < SERIAL_BUFFER_SIZE - 1)
{
serialBuffer[index++] = c; //Array serialBuffer [index +1] gleich gelesene Daten c
}
else if (c == '\n') //wenn c gleich "Ende der Daten" erkannt...
{
serialBuffer[index] = '\0'; //Array auf null zurücksetzen
index = 0;
return true; //Daten wurden gelesen
}
}
return false; //Daten wurden noch nicht gelesen
}
void parseSerial()
{
char* ptr = strtok(serialBuffer, ","); //separiert gelesenen String serialBuffer bis zum , und speichert es in ptr
for (int i = 0; i < arraySize; i++) //für i kleiner als Anzahl Elemente im Array key, i+1...
{
key[i] = strtoul(ptr, NULL, 16); //Array key[i] gleich separierter String ptr, Startpunkt, Anzahl Zahlen/Buchstaben die im String gelesen werden ('0x' für HEX)
ptr = strtok(NULL, ","); //separiert nächsten Abschnitt im String bis zum ,
}
}
Hier ist noch der Punkt unter strtoul(ptr, NULL, 16) nicht ganz klar. Der Wert 16 habe ich wo gelesen, soll die Anzahl der Zahlen/Buchstaben im String sein, die ins Array gehen. Kann aber nicht sein, da wenn ich diesen Wert nach unten oder oben ändere, nur noch Müll empfangen wird.
Ich hoffe ich bin nicht ganz auf dem Holzweg, aber ich denke ich komme der Sache schon näher und so könnte es klappen.
Zu den API Problemen die ich habe/hatte... Ich habe erfahren/gelesen, dass das Xbee das Datenpaket genau in dieser bestimmten Reihenfolge gesendet bekommen muss. Das hat mich irgendwie bisschen irritiert. Darum muss ich am Ende ja auch die empfangenen Werte aufteilen, um den für mich wichtigen Teil zu entnehmen und eine Rückmeldung zu senden.
Mittlerweile verstehe ich selbst nicht mehr was unten und oben ist. Wenn die Xbees auch nur fragen, ob die Daten gesendet werden können und das Empfänger-Xbee sagt ja und empfängt die Daten, dann muss ja eine Verbindung bestehen. Wenn es nicht gesendet werden kann, dann kann das Empfänger-Xbee doch auch nichts mehr empfangen, sprich keine Rückmeldung geben.
Der Sinn wäre ja darin, dass wenn das Sendemodul ausser Reichweite ist, beim Empfänger aber durch kurz vor dem Verbindungsabbruch Befehle empfangen wurden und nun ausgeführt werden, z.B. Motoren läufen, Licht ist an, ect. (ferngesteuertes Auto), dann muss ja der Empfänger das irgendwie bemerken und alles stoppen, resp. ausschalten. Irgendwie war mir das mit den Xbees klar geworden, aber momentan zweifle ich daran, dass das so überhaupt funktioniert :
Das Beste für heute wird sein, mal eine Pause zu machen und den Kopf frei zu kriegen.
Grüsse
Stef