Ich möchte variable Strings von einem Arduino auf den anderen übertragen. Das sieht folgendermaßen aus, es gibt einen Sender und einen Empfänger.
Sender:
void sendData() {
timeString = String(hour) + ":" + String(min) + ":" + String(sec) + "+";
str_len = timeString.length() + 1;
for (int i = 0; i < str_len; i++) {
char c = timeString[i];
mySerial.write(c);
}
}
Es handelt sich hier um eine Simple Uhr. Die Daten für den timeString werden in einer anderen Funktion erstellt und aktualisiert und hier zusammengefügt. Danach wird jeder einzelne char des timeStrings gesendet. Das funktioniert einwandfrei.
Probleme macht der Empfänger:
void getData() {
while (mySerial.available()) {
if (endTransm == false) {
c = (char)mySerial.read();
data += c;
}
if (c == '+') {
endTransm = true;
}
if (endTransm) {
endData = data;
data = "";
endTransm = false;
}
serialData();
}
}
in der variable c werden die Daten "eingefangen" und danach in data zusammengefügt. Bis hierher funktioniert alles bestens. Aber ab dann nicht mehr. Wenn ich mir die Variable endData ausgeben lasse, erhalte ich immer wieder den selben String. Ich möchte eigentlich nur die aktuellen Daten vom Sender Arduino am Empfänger Arduino als einen String ausgeben.
erstmal eine Frage: Im ersten Programm (sendData) in Zeile 3 definierst du str_len als Stringlänge + 1. Danach schreibst du aber:
for (int i = 0; i < str_len; i++) {...
Wenn also (theoretisch) deine String vollkommen leer ist, also timeString.length() = 0, dann wird trotzdem ein Zeichen verschickt, da i(=0) < str_len(=1) ist. Nachdem das Zeichen versendet wird, wird i um 1 erhöht und der Arduino stellt fest, dass i(=0) nicht mehr < str_len(=1) ist. Dadurch wird immer ein Zeichen mehr verschickt, was der Grund für deine Probleme sein könnte.
Vollständige(re) Programme wären hilfreich.
Wie üblich wird vernachlässigt wie langsam die serielle Schnittstelle ist. Ein Zeichen braucht 1 / Baudrate * 10 Sekunden. Man kann das nicht in einer while-Schleife einlesen
Die Sende-Funktion ist ziemlich sinnfrei. Es gibt keinen Grund das Zeichen für Zeichen zu senden
Serenifly:
Wie üblich wird vernachlässigt wie langsam die serielle Schnittstelle ist. Ein Zeichen braucht 1 / Baudrate * 10 Sekunden. Man kann das nicht in einer while-Schleife einlesen
Die Sende-Funktion ist ziemlich sinnfrei. Es gibt keinen Grund das Zeichen für Zeichen zu senden
Ok aber wie soll ich das als ganzen String senden?
Schau was Du als letztes Zeichen ausgegeben bekommst. Es würde auch übertragen.
Das sorgt dafür, das nach Deinem eigens eingesetzten "+" ein weiteres Zeichen eingelesen wird.
Und damit ist die EingangsBedingung deiner while-Schleife erfüllt.