Red de conocimiento informático - Material del sitio web - ¿Cómo implementar la programación de interrupciones del puerto serie en Linux?

¿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 */ /* 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);

}