Status COM Schnittstelle abfragen / setzen
-
Hallo.
Welche Methoden gibt es unter Linux um den Status der seriellen Schnittstelle abzufragen oder zu setzen?
Ich benutze diese:
unsigned int; ioctl(m_Tty_fd, TIOCMSET, &status); ioctl(m_Tty_fd, TIOCMGET, &status);
Das funktioniert aber nicht immer richtig.
Danke.
Gruß
dziuba
-
Hier ein Beispiel aus meinem Buch "C und Linux", das die Statusleitungen des COM-Ports anzeigt:
/* serialinfo.c - Informationen ueber die serielle Schnittstelle holen Quelle: "C und Linux", ISBN 3-446-22427-0 */ # include <stdio.h> # include <unistd.h> # include <fcntl.h> # include <sys/ioctl.h> # include <linux/serial.h> # include <linux/serial_reg.h> # if defined __GLIBC__ # include <sys/io.h> # else # include <asm/io.h> # endif int main(int argc, char *argv[]) { int fd, base_adr, msr; struct serial_struct serial_port; if ((argc != 2) || (strcmp(argv[1], "-h") == 0)) { printf("Usage: serialinfo device\n"); return(0); } if ((fd = open(argv[1], O_RDWR)) == -1) { perror("serialinfo: Can't open device"); return(1); } if (ioctl(fd, TIOCGSERIAL, &serial_port) == -1) { perror("serialinfo: ioctl() failed"); return(1); } base_adr = serial_port.port; printf("Device:\t%s (COM%d)\nPort:\t0x%x\n" "IRQ:\t%d\n", argv[1], serial_port.line+1, serial_port.port, serial_port.irq); ioperm(base_adr+UART_MSR, 1, 1); printf("Line status:\nCD RI DSR CTS\n"); while(1) { msr = inb(base_adr+UART_MSR); printf("\r %d %d %d %d", (msr & UART_MSR_DCD)? 1 : 0, (msr & UART_MSR_RI)? 1 : 0, (msr & UART_MSR_DSR)? 1 : 0, (msr & UART_MSR_CTS)? 1 : 0); fflush(stdout); usleep(100000L); } ioperm(base_adr+UART_MSR, 1, 0); close(fd); return(0); }
Kompilieren mit der Option "-O2" (sonst geht's nicht) und dem Programm root-Rechte geben:
> su Kennwort: # chown root serialinfo # chmod a+s serialinfo # exit > serialinfo /dev/ttyS0
Martin