Eine Serielleübertragung auf Char Arrays aufteilen

Hi Leute,

Ich bräuchte eine kleine Hilfestellung. Mein Problem ist folgendes: Ich will ein LED Display ansteuern welches Daten über die Serielle Übertragung erhält. Dies funktioniert dank vorhandener Libary ganz gut. Im Moment kann ich über die Serielle Kommunikation den text für ein Textfeld senden und anzeigen. Ich möchte aber mehr Textfelder über die Serielle Übertragung senden und anzeigen. Dies würde sich mittels einem Trennzeichen und einem Array bewerkstelligen lassen. Allerdings braucht der Ausgabebefehl ein Char Array als eingabe daher bin ich etwas ratlos wie ich eine Serielle Übertragung auf die verschiedenen Arrays aufteilen kann.

thx

Da gibt es zig Möglichkeiten das zu machen. So z.B.:

char buffer[] = "test1,test2,test3,test4";

char* startPtr = buffer;
while(startPtr < buffer + strlen(buffer))         //solange der Pointer innerhalb des Strings liegt
{
   int length = strcspn(startPtr, ",");          //Länge des Teil-Strings bis zum Delimiter
		
   for(char* ptr = startPtr; ptr < startPtr + length; ptr++)     //Zeichen nacheinander ausgeben
        Serial.print(*ptr);
   Serial.println();
		
   startPtr = startPtr + length + 1;
}

Man kann auch das Array aufteilen und die Strings in neue Arrays kopieren. Das ist aber relativ kompliziert und braucht hier dynamischen Speicher mit malloc()

EDIT:
Da Serial.print() anscheinend NULL-terminiert (was es bei Strings auch sollte), geht auch das hier:

  char buffer[] = "test1,test2,test3,test4";

  char* ptr = strtok(buffer, ",");
  while(ptr != NULL)
  {
    Serial.println(ptr);
    ptr = strtok(NULL, ",");
  }

Ist etwas einfacher. strtok() liefert dabei immer einen Pointer auf den Anfang des nächsten Teil-Strings und ersetzt den Delimter durch NULL.

Ich glaube ich habe mich etwas falsch ausgedrückt :)

 while(Serial.available()){
    current = Serial.read();
    stringa[i] = current;
    i ++;
   }
    dmd.selectFont(SystemFont5x7);
    dmd.drawString(  2, 1, stringa , 5, WHITE,BLACK );
   dmd.drawString(  4, 9, "Alex" , 5, WHITE,BLACK );

Das ist mein code im Moment wie gesagt das klappt nur will ich eben statt dem "Alex" dazu bräuchte ich aber z.b. stringb wie könnte ich hier switchen

Was du willst ist dann die strtok() Variante. Das gibt dir immer einen Pointer auf den nächsten Teil-String welchen du dann in deine Funktion einsetzen kannst.

Wenn du das hast:

char test[] = { '1', '2', '\0', '3', '4', '\0' };

Kannst du das als zwei Strings betrachten. stringa ist gleich test (oder genauer &test[0]). Und stringb ist &test[3]. Es ist daher nicht unbedingt nötig die Strings wirklich in separate Variablen zu kopieren (was aber im ersten Beispiel auch einfach mit strncpy() ginge). Mann kann statt dessen viel einfacher mit Pointern arbeiten.

Also erst mal den kompletten String einlesen. Und danach mehrmals strtok() machen um an die Teil-Strings zu kommen. Wenn du weist, dass du insgesamt immer z.B. drei Strings hast, geht auch sowas:

char* stringa = strtok(buffer, ",");
char* stringb = strtok(NULL, ",");
char* stringc = strtok(NULL, ",");

Siehe hier: http://www.cplusplus.com/reference/cstring/strtok/ http://www.c-howto.de/tutorial-strings-zeichenketten-stringfunktionen-zerteilen-strtok.html

EDIT: Was auch geht es wenn du auf if(c == ',') abfragst. Wenn dann ein Komma da ist, hörst du erst mal mit dem Einlesen auf und gibt den String aus. Danach setzt du deinen Index zurück auf 0 und liest wieder ein bis ein Komma kommt. Du musst dabei aber beim letzten String auch das Ende mitbekommen. Also auch auf LF oder CR abfragen.