Пример 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);

}

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

Используются технологии uCoz