#include #include #include #include #include #include #define BAUDRATE B38400#define MODEMDEVICE "/dev/ttyS1"#define _POSIX_SOURCE 1 /* POSIX-совместимый код */#define FALSE 0#define TRUE 1volatile int STOP=FALSE;void signal_handler_IO (int status); /* объявление обработчика сигнала */int wait_flag=TRUE; /* TRUE до получения сигнала */main(){ int fd,c, res; struct termios oldtio,newtio; struct sigaction saio; /* объявление структуры под сигнал */ char buf[255]; /* открываем устройство для неблокирущего чтения (немедленный возврат из read) */ fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd <0) {perror(MODEMDEVICE); exit(-1); } /* устанавливаем обработчик сигнала перед переводом устройства в асинхронный режим */ saio.sa_handler = signal_handler_IO; /* в моем случае эту строку пришлось закомментировать - прим. перев.) */ saio.sa_mask = 0; saio.sa_flags = 0; saio.sa_restorer = NULL; sigaction(SIGIO,&saio,NULL); /* позволяем процессу получать SIGIO */ fcntl(fd, F_SETOWN, getpid()); /* делаем файловый дескриптор асинхронным (в мануале говорится, что только O_APPEND и O_NONBLOCK будут работать с F_SETFL...) */ fcntl(fd, F_SETFL, FASYNC); tcgetattr(fd,&oldtio); /* сохраняем текущие настройки порта */ /* выставляем новые настройки порта для работы в каноническом режиме */ newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; newtio.c_iflag = IGNPAR | ICRNL; newtio.c_oflag = 0; newtio.c_lflag = ICANON; newtio.c_cc[VMIN]=1; newtio.c_cc[VTIME]=0; tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); /* зацикливаемся в процессе ожидания ввода, также можно делать здесь что-нибудь полезное */ while (STOP==FALSE) { printf(".\n"); usleep(100000); /* после получения SIGIO wait_flag = FALSE, данные доступны и их можно прочитать */ if (wait_flag==FALSE) { res = read(fd,buf,255); buf[res]=0; printf(":%s:%d\n", buf, res); if (res==1) STOP=TRUE; /* выходим из цикла если получен только CR */ wait_flag = TRUE; /* ожидаем новых данных */ } } /* восстанавливаем исходные настройки порта */ tcsetattr(fd,TCSANOW,&oldtio);}/**************************************************************************** обработчик сигнала, устанавливает wait_flag в FALSE чтобы информировать ** вышеприведенный цикл о получении символов ****************************************************************************/void signal_handler_IO (int status){ printf("получен сигнал SIGIO.\n"); wait_flag = FALSE;}
unsigned char state;while(1){ state = inb(0x3FE); if(state & 1) printf("Linia DSR blya izmenilas\n");}