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.htmlhoffe 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 SystemsBeispiel: (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); }