ein Kapitel zurück                                           ein Kapitel weiter

Kommen wir nun zu Funktionen mit denen es möglich ist Baudraten von Terminals zu Erfragen oder zu Setzen. Damit könnten wir zum Beispiel testen wie die Geschwindigkeit zwischen 2 Terminals im Netzwerk ist. Folgende Funktionen stehen uns zum Erfragen der Geschwindigkeit zur Verfügung.....

speed_t cfgetispeed(const struct termios *tty_zeiger);
speed_t cfgetospeed(const struct termios *tty_zeiger);  

Beide Funktionen sind in der Headerdatei <termios.h> definiert und geben die momentan gesetzte Baudrate zurück. Wobei cfgetispeed() die Baudraten-Eingabe und cfgetospeed() die Baudraten-Ausgabe zurückgibt. Folgende Konstanten sind dafür auf alle Fälle definiert:

B0,B50,B75,B110,B134,B150,B200,B300,B600,B1200,B1800,B2400,B4800,B9600,B19200,B38400  

Wobei B0 für die Beendigung der Verbindung steht. Weiterhin können (unter Linux auf alle Fälle) vorhanden sein:

B57600,B115200,B230400,B460800  

Angewendet wird die Funktion folgendermaßen....

baudrate = funktion_erfrage_baudrate(cfgetispeed(&terminal));
  ........
  .......
unsigned long funktion_erfrage_baudrate(speed baudkonstante)
 {
    if(baudkonstante == B0)             return(0);
    else if(baudkonstante == B50)    return(50);
    else if(baudkonstante == B75)    return(75);
    .........
    .........
    .........
    else if(baudkonstante == B460800)    return(460800);
    else   return ERROR;
}  

Nun anstatt jede einzelne Baudkonstante schriftlich abzufragen können wir uns das ganze etwas einfacher machen mit einer for-Schleife und 2 Arrays. Hier nun ein Beispiel womit wir die Baudrate eines Gerätes erfragen das sie in der Kommandozeile mit eingeben mit z.B. baud /dev/tty
Damit fragen wir die Baudrate unseres Kontrollterminals ab. Hier nun das Programm.......

/*Download:baud.c*/
#include <stdio.h> #include <unistd.h> #include <termios.h> #include <fcntl.h> enum{ERROR=-1,SUCCESS}; typedef unsigned long Ulong; typedef struct termios TTY; speed_t baud_konstante[] = { B0,B50,B75,B110,B134,B150,B200,B300,B600,B1200, B1800,B2400,B4800,B9600,B19200,B38400,B57600, B115200,B230400,B460800 }; Ulong baud_werte[] = { 0,50,75,110,134,150,200,300,600,1200, 1800,2400,4800,9600,19200,38400,57600, 115200,230400,460800 }; Ulong baudrate_wert(speed_t baud) { int i; for(i=0; i<=19; i++) { if(baud == baud_konstante[i]) return(baud_werte[i]); } return ERROR; } int main(int argc, char **argv) { int fd; speed_t baud_input, baud_output; TTY terminal; if(argc != 2) { printf("Bitte einen Gerätepfad mitangeben!!!\n"); exit(0); } if((fd =open(argv[1], O_RDWR | O_NONBLOCK)) == ERROR) { printf("Konnte Gerätedatei %s nicht öffnen!!\n",argv[1]); exit(1); } if(isatty(fd) == 0) { printf("%s ist keine tty.......\n",argv[1]); exit(2); } if(tcgetattr(fd, &terminal) == ERROR) { printf("Fehler bei tcgetattr......\n"); exit(3); } if(( baud_input = baudrate_wert(cfgetispeed(&terminal))) == ERROR) { printf("Fehler bei baud_input........\n"); exit(4); } if(( baud_output = baudrate_wert(cfgetospeed(&terminal))) == ERROR) { printf("Fehler bei baud_output........\n"); exit(5); } printf("Eingabe-Baudrate : %lu\n",baud_input); printf("Ausgabe_Baudrate : %lu\n",baud_output); return 0; }

Neu in diesem Programm dürfte nur die Funktion........

int isatty(int fd);  

....sein. Diese Funktion liefert im Fehlerfalle 0 und wenn TRUE 1. Damit können wir Abfragen ob ein Filedeskriptor auf das Terminal eingestellt ist. Was noch wichtig an den Funtkion cfget...() und cfset()... Funktionen ist das sie wenn sie die Funktion mit cfgetispeed() z.B. Abfragen wollen müssen sie zuerst mit tcgetattr die Struktur termios für das Betreffende Gerät erfragen. Dasselbe gilt auch wenn sie die beiden Funktionen....

int cfsetispeed(struct termios *termzeiger, speed_t baudrate);
int cfsetospeed(struct termios *termzeiger, speed_t baudrate);  

.....setzen wollen, müssen sie diese Aufrufe mit dem tcsetattr - Aufruf aktivieren. Hier nun unser Beispiel erweitert mit dem setzen von der Baudrate auf 115200 Baud. Ob aber durch den Aufruf....

setbaud /dev/modem oder setbaud /dev/ttyS0  

...das Modem dann tatsächlich mit dieser Geschwindigkeit läuft läßt sich stark bezweifeln. Hier nun der Code......

/*Download:setbaud.c*/
#include <stdio.h> #include <unistd.h> #include <termios.h> #include <fcntl.h> enum{ERROR=-1,SUCCESS}; typedef unsigned long Ulong; typedef struct termios TTY; speed_t baud_konstante[] = { B0,B50,B75,B110,B134,B150,B200,B300,B600,B1200, B1800,B2400,B4800,B9600,B19200,B38400,B57600, B115200,B230400,B460800 }; Ulong baud_werte[] = { 0,50,75,110,134,150,200,300,600,1200, 1800,2400,4800,9600,19200,38400,57600, 115200,230400,460800 }; void fehler_exit(char *error_msg,...) { va_list az; va_start(az,error_msg); vprintf(error_msg,az); va_end(az); exit(0); } Ulong baudrate_wert(speed_t baud) { int i; for(i=0; i<=19; i++) { if(baud == baud_konstante[i]) return(baud_werte[i]); } return ERROR; } int main(int argc, char **argv) { int fd; speed_t baud_input, baud_output; TTY terminal; if(argc != 2) fehler_exit("Bitte einen Gerätepfad mitangeben!!!\n"); if((fd =open(argv[1], O_RDWR | O_NONBLOCK)) == ERROR) fehler_exit("Konnte Gerätedatei %s nicht öffnen!!\n",argv[1]); if(isatty(fd) == 0) fehler_exit("%s ist keine tty.......\n",argv[1]); if(tcgetattr(fd, &terminal) == ERROR) fehler_exit("Fehler bei tcgetattr......\n"); if(( baud_input = baudrate_wert(cfgetispeed(&terminal))) == ERROR) fehler_exit("Fehler bei baud_input........\n"); if(( baud_output = baudrate_wert(cfgetospeed(&terminal))) == ERROR) fehler_exit("Fehler bei baud_output........\n"); printf("Eingabe-Baudrate : %lu\n",baud_input); printf("Ausgabe_Baudrate : %lu\n",baud_output); if((cfsetispeed(&terminal,B115200)) == ERROR) fehler_exit("Fehler beim setzen von Eingabe-Baudrate........\n"); if((cfsetospeed(&terminal,B115200)) == ERROR) fehler_exit("Fehler beim setzen von Ausgabe-Baudrate........\n"); if(tcsetattr(fd,TCSAFLUSH, &terminal) == ERROR) fehler_exit("Fehler bei tcsetattr......\n"); if(tcgetattr(fd, &terminal) == ERROR) fehler_exit("Fehler bei tcgetattr......\n"); if(( baud_input = baudrate_wert(cfgetispeed(&terminal))) == ERROR) fehler_exit("Fehler bei baud_input........\n"); if(( baud_output = baudrate_wert(cfgetospeed(&terminal))) == ERROR) fehler_exit("Fehler bei baud_output........\n"); printf("Eingabe-Baudrate-neu : %lu\n",baud_input); printf("Ausgabe_Baudrate-neu : %lu\n",baud_output); return 0; }

Weiter Funktionen die in der Headerdatei <termios.h> definiert sind wären...

int tcdrain(int fd);
int tcflush(int fd, int puffer);
int tcsendbreak(int fd, int dauer);
int tcflow(int fd, int aktion);  

Die Funktionen sind recht simpel. Lesen sie daher bitte selbst die man - Pages dazu (man termios).

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf