configuration du port série de l'interruption de l'linux

Je suis en train de mettre de l'interruption, pour un port série dans ubuntu (dans le programme écrit en C), mais il ne fonctionne pas. J'ai vérifié que la communication série fonctionne correctement sans interruption, donc j'ai peut-être quelque chose de mal.
Le code est le suivant:

    #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <errno.h>
#include <termios.h>
void signal_handler_IO (int status);   /* definition of signal handler */
int n;
int fd;
int connected;
struct termios termAttr;
struct sigaction saio;
int main(int argc, char *argv[])
{
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
perror("open_port: Unable to open /dev/ttyO1\n");
exit(1);
}
saio.sa_handler = signal_handler_IO;
saio.sa_flags = 0;
saio.sa_restorer = NULL; 
sigaction(SIGIO,&saio,NULL);
fcntl(fd, F_SETFL, FNDELAY);
fcntl(fd, F_SETOWN, getpid());
tcgetattr(fd,&termAttr);
baudRate = B115200; 
cfsetispeed(&termAttr,B115200);
cfsetospeed(&termAttr,B115200);
termAttr.c_cflag &= ~PARENB;
termAttr.c_cflag &= ~CSTOPB;
termAttr.c_cflag &= ~CSIZE;
termAttr.c_cflag |= CS8;
termAttr.c_cflag |= (CLOCAL | CREAD);
termAttr.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
termAttr.c_iflag &= ~(IXON | IXOFF | IXANY);
termAttr.c_oflag &= ~OPOST;
tcsetattr(fd,TCSANOW,&termAttr);
printf("UART1 configured....\n");
connected = 1;
while(connected == 1){
//some code
}
close(fd);
exit(0);             
}
void signal_handler_IO (int status)
{
printf("received data from UART.\n");
}

À tout moment à l'heure d'un autre appareil envoyer un message via le port configuré, le message "les données reçues à partir de l'UART." n'est jamais affiché.

Toute suggestion pour résoudre ce problème? Aussi, comment le système se rapportent à l'interruption, avec le port série?, J'ai lu sur le signal.h mais je n'ai pas trouvé de réponse pour ça. J'ai eu l'interruption de l'idée à partir de cette page: http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html

Merci d'avance pour toute aide.
Merci à l'avance.

  • 1) je ne voudrais pas installer le gestionnaire de signal avant l'initialisation de l'ats est terminé. 2) Vous ne devez pas appeler printf() à partir d'un gestionnaire de signal; printf() est non réentrant.
  • Merci pour la réponse, mais suite à vos commentaires, le "interruption" ne fonctionne toujours pas. Plus d'idées?
InformationsquelleAutor gus | 2013-02-27