[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Kommunikation über /dev/ttyS0



Hallo Armin, hallo Kristian,

ich muß für ein Laborexperiment den PC über die serielle
Schnittstelle mit einem Gerät verbinden. Gibt es eine
Library mit der ich die Schnittstelle programmieren kann?
Ich suche jetzt schon länger aber so richtig fündig bin ich
nicht geworden.

ich habe auch dieses Ziel. Aber mein Notebook hat leider keinen COM-Anschluß :-)
Vielleicht hilft dir das etwas weiter:

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

Ich habe auch noch andere Sammelstücke mit evtl. nützlichem Inhalt. Aber die haben zusammen ca. 5MB.
Wenn du möchtest kann ich sie dir schicken.

Gruß Ulrich




Reply to: