¿Cómo implementar la programación de interrupciones del puerto serie en Linux?
#include
#include
#include
#include
#include
#include
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* Compatibilidad del sistema POSIX*/
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE
void signal_handler_IO (int status); Definir controlador de señal */
int wait_flag=TRUE /* Si no se recibe ninguna señal, será TRUE */
main()
{
int fd, c, res;
struct termios oldtio, newtio;
struct sigaction saio /* definición de acción de señal */
char buf[255];
/* Abra el dispositivo como sin bloqueo (la función de lectura finalizará y regresará inmediatamente) */
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd lt; 0) {perror(MODEMDEVICE); exit(-1);
/* Instalar la señal antes de desincronizar el controlador del dispositivo. */
saio.sa_handler = signal_handler_IO;
saio.sa_mask = 0;
saio.sa_flags = 0; sa_restorer = NULL;
sigaction(SIGIO, amp; saio, NULL);
/* Permitir que el proceso reciba la señal SIGIO*/
fcntl( fd, F_SETOWN, getpid());
/* Hacer que el descriptor de archivo sea asincrónico (el manual del usuario dice que solo se pueden usar O_APPEND y
O_NONBLOCK, y F_SETFL...) */
fcntl(fd, F_SETFL, FASYNC);
tcgetattr(fd, amp; oldtio /* Almacena la configuración actual del puerto serie */ p>
/* Establece el nuevo puerto serie como programa de entrada estándar*/
newtio.c_cflag = BAUDRATE |
_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON
newtio.c_cc[VMIN]=1; p>
p>
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH
tcsetattr(fd, TCSANOW, amp; newtio) ;
/* Bucle esperando señal de entrada Aquí haremos muchas cosas útiles*/
while (STOP==FALSE) {
printf. (".\ n"); usleep(100000);
/* Después de recibir SIGIO, wait_flag = FALSE, la señal de entrada se puede leer si existe */
if ( wait_flag== FALSO) {
res = read(fd,buf,255
buf[res]=0; :d\ n", buf, res);
if (res==1) STOP=TRUE; /* Si solo se ingresa CR, detenga el bucle*/
wait_flag = TRUE; / * Esperar nueva señal de entrada*/
}
}
/* Guardar la configuración anterior del puerto serie*/
tcsetattr(fd,TCSANOW,amp;oldtio);
}