Daten aus der Serielleschnittstelle Lesen und ausgeben



  • Hallo C Freunde,

    ich habe in Forum gesucht, leider nicht über diese Thema was gefunden.

    Ich habe folgendes Problem:
    Ich bekomme über /dev/ttys0 ein Byte (z.B. "A"); Wie kann ich das auslesen und wieder ausgeben? Mein Programm dass ich geschrieben habe funktioniert leider nicht.
    fd ist File-Deskriptor und wird auch erfolgreich geöffnet.
    beim Ausführen bekomme ich die fehler von der Zeile 8;

    int get_byte(void){
      char buffer[10];  /* Input buffer */
      int nbytes;
      if (fd != -1)
       {	
    	nbytes=read(fd, buffer, 1);
     	if(nbytes>0)        return buffer[0];	
    	else {printf("fehler\n");return -1;}
       }
       else perror("open_port: Unable to open port");
    }
    


  • es wäre hilfreich zu wissen, was für ein Fehler aufgetreten ist.
    Frag doch einfach mal den Wert der globalen Variable errno ab. Diese ist in STDLIB.h deklariert und enthält einen Fehlercode des zuletzt aufgetretenen Fehlers.



  • char buffer[10];  /* Input buffer */
      char *akt_buffer_e; /*aktuelle Buffer*/
      int nbytes;
      if (fd != -1)
       {   
         nbytes=read(fd, akt_buffer_e, 1);
         if(nbytes>0)        return buffer[0];   
         else {perror("fehler:");return -1;}
       }
       else perror("open_port: Unable to open port");
    

    Wenn ich ausführe bekomme folgende Fehlermeldung:
    fehler:: Resource temporarily unavailable



  • Ich habe die Einstellung von

    fcntl(fd, F_SETFL, FNDELAY);
    

    auf

    fcntl(fd, F_SETFL, 0);
    

    gesetzt. jetzt bekomme ich

    [b]fehler:: Success[/b]
    

    was bedeutet das? heißt das, dass lesen erfolgreich war?



  • diese Funktionen sind doch kein ANSI-C oder? sieht mir eher nach UNIX aus.
    Aber wenn das so ausgegeben wird, dann ist kein fehler passiert



  • fcntl(fd, F_SETFL, FNDELAY); ist C Funktion.

    Aber wenn alles ok ist, warum springt zur Zeile 8. Es soll die ByteZahl ausgeben. oder?



  • wie öffnest du denn die Datei. Hier mal ein Ausschnitt aus einem Beispiel
    wie bereits einmal in diesem Forum gepostet.

    # define TERM_DEVICE "/dev/ttyS0" 
    
    int main()
    {
    
       if ((fd = open(TERM_DEVICE, O_RDWR)) == -1) 
       { 
        perror("terminal: Can't open device " TERM_DEVICE); 
        return(1); 
       } 
    }
    

    und dazu noch der komplette Link: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39504.html

    Gruß Tom



  • Ja das ist schon auch C aber eben nicht teil der std. C-Library.
    Da bin ich mir deshalb so sicher weil die Funktion in <unistd.h> deklariert ist.



  • Wenn du alles richtig gemacht hast, und trotzdem nichts gelesen wird, dann solltest du mal das Programm portmon herunterladen und schaun was auf dem port so abläuft.



  • Das ist ein Super Idee mit portmon.
    man soll die fehlerQuelle erst untersuchen :).
    gibt das Programm auch für Suse Linux? oder Ähnliches?



  • ich mache das Port so auf.

    const char *port="/dev/ttyS0";
    void PortVerbinden(){
        struct termios options;  
        fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
        fcntl(fd, F_SETFL, 0);
    
        tcgetattr(fd, &options);
    
        options.c_cflag &= ~CSIZE; 
        options.c_cflag |= CS8;    /* Select 8 data bits */
    
        /*Set the baud rates to B9600...*/
        cfsetispeed(&options, B9600);
        cfsetospeed(&options, B9600);
        /*No Parity*/
        options.c_cflag &= ~PARENB;
        options.c_cflag &= ~CSTOPB;
        options.c_cflag &= ~CSIZE;
        options.c_cflag |= CS8;
        /* set the options */
        tcsetattr(fd, TCSANOW, &options);
    }
    


  • puhh... Bin nicht wirklich der Held wenn es um linux geht. Aber probier doch mal folgenden Link: http://www.ilkertemir.com/source/unix/portmon/
    Oder gib einfach mal unter google "portmon Unix" ein, denke wenn du das runterlädst wirste eh den quellcode haben. Dann kannste das ganze für deine Distribution kompilieren und fertig.



  • Übrigens siehst du dann auch wie du den port öffnest und wie du ihn einstellst. Ist auch ganz gut zum prüfen ob du alles richtig machst


Anmelden zum Antworten