Rückgabe eines Strings aus eine Funktion
-
Guten Tag,
ich möchte gerne aus einer Funktion den dort von der Seriellen Schnittstelle eingelesenen String als Rückgabewert erhalten. Im Moment sieht das ganze wie folgt ausint serial_read(int port){ int buffer_size = 4 // Größe des Eingabepuffers char buffer[buffer_size]; // Eingabepuffer für die komplette Eingabe int anz; // gelesene Zeichen char c; // Eingabepuffer für das aktuelle Byte int i; // Zeichenposition bzw Index i = 0; do{ // Lesen bis zur Puffergröße (im Moment 4 Byte) anz = read(port, (void*)&c, 1); if (anz > 0){ if (c != '\r'){ buffer[i++] = c; } } }while (c != '\r' && i < buffer_size && anz >= 0); if (anz < 0) { perror("Lesen fehlgeschlagen"); } else if (i == 0) { perror("Keine Daten empfangen"); } else { buffer[i] = '\0'; // printf("%i Bytes: %s", i, buffer); // zur Fehlersuche } // Rückgabewert int ergebnis; if (strstr(buffer,"_OK_")){ ergebnis = 1; } else{ ergebnis = 0; } return ergebnis; }
Meine C Kenntnisse sind noch nicht so gut ;). Ich habe es erst einmal so gelöst, dass ich einfach den eingehenden String einfach auf eine Zeichenkette überprüfe und dann etntweder eine 1 oder eine 0 zurück gebe.
Das ganze Programm soll zur Steuerung eines µC mit dem PC sein.
Ich hoffe das mir jemand weiterhelfen kann.
Schönen Karfreitag noch
Gruß Andreas
-
@Andreas-Dues Du musst buffer und buffer_size an die Funktion mit übergeben (so wie port).
4 ist zu wenig um als C-String „OK“ und die '\0' aufzunehmen.
Das buffer[i] = 0; überschreibt dann andere Daten.
-
Zeile 3 verwendet VLA, das ist großer Unfug.
Zeile 9 verwendet einen Zeigercast, das ist hier großer Unfug. (verwendest du den C++ Modus des Compilers?!)Buffer musst du im aufrufenden Kontext definieren, innerhalb von LowLevel Funktionen macht man keine Ausgaben auf stdout/stderr sondern ebenfalls allenfalls im aufrufenden Kontext.
int serial_read (int port, char *b, int buffermax) { int anz; // gelesene Zeichen int i = 0; // Zeichenposition bzw Index do { // Lesen bis zur Puffergroesse anz = read (port, b, 1); if (anz > 0) if (*b != '\r') b++,i++; } while (*b != '\r' && i < buffermax-1 && anz >= 0); *b = 0; if (i == 0) { perror ("Keine Daten empfangen"); } // Rueckgabewert int ergebnis; if (strstr (b, "_OK_")) { ergebnis = 1; } else { ergebnis = 0; } return ergebnis; } int main () { char buffer[BUFSIZ]={0}; int r = serial_read (4711, buffer, BUFSIZ); printf ("%d\n%s", r, buffer); return 0; }
-
Danke für die Informationen
Also muss ich den Buffer als globales Char Arrays erstellen um sie weiter zu verarbeiten.
-
Nein, versuche globale Variablen so weit wie möglich zu vermeiden. Es reicht aus, den Puffer in der aufrufenden Funktion zur Verfügung zu stellen. Genau so, wie wob das in seinem Beispiel schon gemacht hat.
-
@Andreas-Dues
Globale Variablen sind grober Unfug, werden nur von Hochschulprofessoren, Buchautoren, Tutorialschreiberlingen und TopProfis (denn die wissen was sie tun) eingesetzt.
Alles nicht deine Kategorien.
Globale Variablen haben in deinem Fall zB den Nachteil, dass die Initialisierung nur einmal passiert, du den Buffer aber mehrfach verwenden wirst und dann diverse Fehlerszenarien debuggen darfst - alles vermeidbar ohne deren Verwendung.
-
Dieser Beitrag wurde gelöscht!
-
Guten Morgen und frohe Ostern,
vielen Dank für die Infos eurerseits.Gruß Andreas