/* Команда для изменения скорости обмена в линии (baud).*/
/* Пример вызова в XENIX: baud /dev/tty1a 9600 */
/* /dev/tty1a - это коммуникационный последов. порт #1 */
/* Про управление модами терминала смотри man termio */
#include <fcntl.h>
#include <termio.h>
struct termio old, new; int fd = 2; /* stderr */
struct baudrate{ int speed; char *name;} br[] = {
{ B0, "HANGUP" }, { B1200, "1200" }, { B9600, "9600" },
{ B600, "600" }, { B2400, "2400" }, { EXTA, "19200" },
};
#define RATES (sizeof br/sizeof br[0])
main(ac, av) char *av[];
{ register i; char *newbaud;
if( ac == 3 ){
if((fd = open(av[1], O_RDWR)) < 0 ){
printf("Не могу открыть %s\n", av[1]); exit(1);
} newbaud = av[2];
} else newbaud = av[1];
if( ioctl(fd, TCGETA, &old) < 0 ){
printf("Попытка управлять не терминалом и не портом.\n");
exit(2);
}
if(newbaud == (char*)0) newbaud = "<не задано>";
new=old;
for(i=0; i < RATES; i++)
if((old.c_cflag & CBAUD) == br[i].speed) goto ok;
printf("Неизвестная скорость\n"); exit(3);
ok: printf("Было %s бод\n", br[i].name);
for(i=0; i < RATES; i++)
if( !strcmp(newbaud, br[i].name)){
new.c_cflag &= ~CBAUD; /* побитное "или" всех масок B... */
new.c_cflag |= br[i].speed;
if( ioctl(fd, TCSETA, &new) < 0) perror("ioctl");
/* Скорость обмена может не измениться, если терминал
* не открыт ни одним процессом (драйвер не инициализирован).
*/ exit(0);
}
printf("Неверная скорость %s\n", newbaud); exit(4);
}
© Copyright А. Богатырев, 1992-95
Си в UNIX
Назад | Содержание | Вперед