Probleme mit serieller Schnistelle



  • Hallo zusammen ich hab da ein kleines Problem. Ich möchte ein Modem an der seriellen Schnittstelle auslesen und ankomende Zeichen z.b. nach einem RING durchsuchen. Leider bekomme ich wenn ich read() verwende nur immer Bruchstücke des Ankommenden Befehls. Ich habe einen Signalhandler eingerichtet das mir das Programm nur das serielle Schnittstelle abfragt wenn auch etwas vorhaden ist. Hier der Quellcode vielleicht hat ja jemand eine Idee.

    # include <stdio.h>
    # include <unistd.h>
    # include <fcntl.h>
    # include <string.h>
    # include <signal.h>
    # include <termios.h>
    
    # define TERM_DEVICE "/dev/ttyS0"   /* = COM1 */
    # define TERM_SPEED B9600      /* Bit/Sek */
    
    void signal_handler_IO (int status);
    
    int start = 0;
    
    int main()
     {
      int fd, zyklus = 0;
      ssize_t length;
      char buffer[16];
      struct termios term_attr;
      struct sigaction saio;
    
    // Serielle Schnitstelle öffene
      if ((fd = open(TERM_DEVICE, O_RDWR | O_NONBLOCK)) == -1)
       {
        perror("terminal: Can't open device " TERM_DEVICE);
        return(1);
       }
    
    // Modem Parametrieren
    
    // Alte Paramaeter von Modem einlesen
      if (tcgetattr(fd, &term_attr) != 0)
       {
        perror("terminal: tcgetattr() failed");
        return(1);
       }
    
    // Parameter ändern
      term_attr.c_cflag = TERM_SPEED | CS8 | CRTSCTS | CLOCAL | CREAD;
      term_attr.c_iflag = 0;
      term_attr.c_oflag = OPOST | ONLCR;
      term_attr.c_lflag = 0;
    
    //Parameter auf Modem schreiben
      if (tcsetattr(fd, TCSAFLUSH, &term_attr) != 0)
        perror("terminal: tcsetattr() failed");
    
    // Signal auf Modem setzen
        saio.sa_handler = signal_handler_IO;
        saio.sa_flags = 0;
        saio.sa_restorer = NULL;
        sigaction(SIGIO,&saio,NULL);
    
        // Einrichten des asynchnonen E/A
        fcntl(fd,F_SETOWN, getpid());
        fcntl(fd,F_SETFL,FASYNC);
    
    // Schleife starten
      while (1)
       {
    
        // Modemabfrage starten
        if(start == 1){
    
        // Signal ignorieren
        saio.sa_handler = SIG_IGN;
        saio.sa_flags = 0;
        saio.sa_restorer = NULL;
        sigaction(SIGIO,&saio,NULL);
    
          // Lesen vom Modem
          if ((length = read(fd, buffer, 16)) == -1)
             perror("terminal: read() failed");
          else
             write(STDOUT_FILENO, buffer, length);
    
          // Bei Länge 0 zyklus addieren
          if(length == 0){
          zyklus +=1;
          }
    
          // Nach 10000 Zyklen wieder auf Signal warten
          if(zyklus == 10000){
          zyklus = 0;
          start = 0;
    
        // SIGNAL handler wieder starten
        saio.sa_handler = signal_handler_IO;
        saio.sa_flags = 0;
        saio.sa_restorer = NULL;
        sigaction(SIGIO,&saio,NULL);
          }
        }
       }
    
      printf("Aborted.\n");
      close(fd);
      return(0);
    }
    
    void signal_handler_IO (int status){
    
     printf("received SIGIO signal.\n");
     start = 1;
    }
    

    Danke
    Gruss Marco

    [ Dieser Beitrag wurde am 14.03.2003 um 01:34 Uhr von hugobossxx editiert. ]


Anmelden zum Antworten