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. ]