Пример 15

/* Команда для изменения скорости обмена в линии (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 www.abyss-group.narod.ru
Си в UNIX

Назад | Содержание | Вперед

Hosted by uCoz