Sto cercando di impostare l'interruzione per una porta seriale in ubuntu (nel programma scritto in C), ma non funziona. Ho controllato che la comunicazione seriale funzioni correttamente senza l'interruzione, quindi potrei impostare qualcosa di sbagliato. Il codice è il seguente:impostazione interruzione porta seriale in linux
#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");
}
Così il tempo in qualsiasi momento un altro dispositivo invia un messaggio tramite la porta configurata, il messaggio "ha ricevuto i dati da UART." non viene mai visualizzato.
Qualche suggerimento per risolvere questo problema? Inoltre, come si collega il sistema all'interruzione con la porta seriale? Ho letto su signal.h ma non ho trovato una risposta per questo. Ho ricevuto l'idea di interruzione da questa pagina: http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html
Grazie in anticipo per qualsiasi aiuto. Grazie in anticipo.
1) Non installarei il gestore di segnale prima che l'inizializzazione di ttyS sia completata.2) Non dovresti chiamare printf() da un gestore di segnale; printf() è non rientranti. – wildplasser
Grazie per aver risposto, ma seguendo i tuoi commenti la "interruzione" continua a non funzionare. Altre idee? – gus