com-port konfigurieren



  • hi leute!

    ich bin gerade dabei einen microcontroller zu programmieren und möchte auf seite des PC ein programm mit protokoll unter linux programmieren... nun hab ich das problem, dass ich unter win**** mit hyperterminal daten reinbekomme, unter linux mit cat /dev/ttyS0 aber nicht... ich hab den port schon mit stty und setserial konfiguriert, geht aber nicht... hat jemand vielleicht noch ne möglichkeit, wie ich /dev/ttyS0 auf 9600baud,1 stopbit, keine parität und kein hw-protokoll initialisieren kann?? (hab suse 7.2)



  • Versuch's doch mal mit "minicom".
    Oder nimm den folgenden Quelltext aus meinem Buch "C und Linux":

    /*
        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 B9600		/* 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 | 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);
     }
    

    Oder noch besser, kauf dir mein Buch 😃 (die 2. Auflage erscheint nächsten Monat.)



  • Hallo,

    falls du mit QT schon mal was gemachst hast kannst du dir auch mal QextSerial anschauen:

    http://www.wroth.addr.com/

    damit kann man dann auch schoen plattformunabhaengig arbeiten (win32 / posix)



  • danke!! hab das problem inzwischen selber hinbekommen, war teilweise auch ein prob mit der elektronik (wenn das parallele kabel zum programmieren des controllers angesteckt war, hab ich keine daten über seriel reinbekommen (komicherweise nur unter Linux, unter Win**** gehts auch mit dem kabel)) (vielleicht weiß da ja auch noch jemand was) ansonsten hab ich mir selber ein c++ proggie geschrieben, dass dem von Martin G. sehr ähnelt... *g* (ich hab da aber auch noch ne anweisung drinne zum anschalten des RAW-Modus)


Anmelden zum Antworten