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 aus

    int 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.



  • @Andreas-Dues

    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


Anmelden zum Antworten