Serielle Schnittstelle ansprechen



  • Hallo,
    ich möchte im Rahmen einer Projktarbeit die serielle Schnittstelle unter Linux mit Hilfe von Ansi C ansprechen (Daten einlesen). Leider habe ich keine Ahnung wie ich das anstellen soll. Kennt jemand vielleicht ein Tutorial oder Dokumentation im Netz über dieses Thema?

    [edit]Thema für die FAQ angepasst[/edit]

    [ Dieser Beitrag wurde am 25.09.2002 um 23:00 Uhr von kingruedi editiert. ]



  • hi,

    ich habe viele infos von hier :
    http://www.easysw.com/%7Emike/serial/serial.html
    http://www.stokely.com/unix.serial.port.resources/index.html

    hoffe es hilft

    [ Dieser Beitrag wurde am 03.06.2002 um 20:20 Uhr von worst_case editiert. ]



  • Im Grunde öffnest du aber nur den SerPort wie eine Datei und schreibst drauf wie in eine Datei.



  • In den HowTo's gibts auch was:

    /usr/share/doc/HOWTO/HTML/en/Serial-Programming-HOWTO.html

    BjörnP



  • libserial - eine fertige Bibliothek für die Serielleschnittstelle

    Serial Programming HOWTO
    IO Port Programming HOWTO
    Serial HOWTO
    Serial Programming Guide for POSIX Compliant Operating Systems

    Beispiel: (25.7.2002)
    Ein Code von <Martin> aus seinem Buch "C und Linux"

    C und Linux | ISBN: 3446224270

    /*
        terminal.c - Ein- und Ausgabe ueber die serielle
                     Schnittstelle
    */
    
    # include <stdio.h>
    # include <unistd.h>
    # include <fcntl.h>
    # include <termios.h>
    
    # define TERM_DEVICE "/dev/ttyS0"   /* = COM1 */
    # define TERM_SPEED B19200      /* Bit/Sek */
    
    int main()
     {
      int fd, old_flags;
      ssize_t length;
      char buffer[16];
      struct termios term_attr;
      fd_set input_fdset;
    
      if ((fd = open(TERM_DEVICE, O_RDWR)) == -1)
       {
        perror("terminal: Can't open device " TERM_DEVICE);
        return(1);
       }
                /* RS232 konfigurieren */
      if (tcgetattr(fd, &term_attr) != 0)
       {
        perror("terminal: tcgetattr() failed");
        return(1);
       }
      term_attr.c_cflag = TERM_SPEED | CS8 | CRTSCTS | CLOCAL;
      term_attr.c_iflag = 0;
      term_attr.c_oflag = OPOST | ONLCR;
      term_attr.c_lflag = 0;
      if (tcsetattr(fd, TCSAFLUSH, &term_attr) != 0)
        perror("terminal: tcsetattr() failed");
    
                /* Std.-Eingabe anpassen */
      if (tcgetattr(STDIN_FILENO, &term_attr) != 0)
       {
        perror("terminal: tcgetattr() failed");
        return(1);
       }
                /* alte Einst. sichern */
      old_flags = term_attr.c_lflag;
      term_attr.c_lflag &= ~(ICANON | ECHO);
      if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr) != 0)
        perror("terminal: tcsetattr() failed");
    
      while (1)
       {
        FD_ZERO(&input_fdset);
        FD_SET(STDIN_FILENO, &input_fdset);
        FD_SET(fd, &input_fdset);
        if (select(fd+1, &input_fdset, NULL, NULL, NULL) == -1)
          perror("terminal: select() failed");
        if (FD_ISSET(STDIN_FILENO, &input_fdset))
         {
          if ((length = read(STDIN_FILENO, buffer, 16)) == -1)
            perror("terminal: read() failed");
          else
            if (buffer[0] == '\33')  /* Abbruch mit ESC */
          break;
        else
              write(fd, buffer, length);
         }
        if (FD_ISSET(fd, &input_fdset))
         {
          if ((length = read(fd, buffer, 16)) == -1)
            perror("terminal: read() failed");
          else
            write(STDOUT_FILENO, buffer, length);
         }
       }
                /* Std.-Eingabe wie vorher */
      term_attr.c_lflag = old_flags;
      if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr) != 0)
        perror("terminal: tcsetattr() failed");
    
      printf("Aborted.\n");
      close(fd);
      return(0);
     }
    

Anmelden zum Antworten