Datenübertragung zwischen 2 Arduinos

Hallo zusammen.

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.

Ich hoffe jemand weis einen Rat.

mfg

s-fr:
Ich möchte eigentlich nur die aktuellen Daten vom Sender Arduino am Empfänger Arduino als einen String ausgeben.

Nein das möchtest Du nicht, und das ist auch gut so - aber das erklären andere...

Ich hoffe jemand weis einen Rat.

Schuss ins Blaue:

  str_len = timeString.length() + 1;

Warum?

Das "+" ist Dein Endezeichen?
Dann wäre

if (endTransm) {

überflüssig.

Hallo,

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.

Gruß
HTML-Fan

Schau Dir mal die Routine hier an.

Gruß Tommy

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?

Serial.print()/println()? So wie man auch alles andere sendet.

Die Funktion die oben verlinkt wurde erwartet ein LF am Ende. Dann macht man println() und gut ist

Wenn Du Serenifly folgst, vermeidest Du den Fehler, den Du machst und der Dir das Genick bricht.

Um Dir zu zeigen, wo Dein Fehler ist:

void setup()
{ Serial.begin(115200); }
void loop()
{ sendData();}
void sendData() {
String timeString="22:39:00+";
int str_len;
 str_len = timeString.length() + 1;
 Serial.print("timeString: ");
 Serial.println(timeString);
 Serial.print("Länge TimeString: ");
 Serial.println(timeString.length());
 Serial.print("Str_LEN : ");
 Serial.println(str_len);
 for (int i = 0; i < str_len; i++) {
   char c = timeString[i];
   Serial.print(i); Serial.print(","); Serial.print(c); Serial.print(" # ");
 }
 Serial.println();
}

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.