我想設置ubuntu中的串口中斷(在用C編寫的程序中),但它不起作用。我已經檢查過串行通訊沒有中斷情況下正常工作,所以我可能會設置錯誤。 代碼如下:在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");
}
所以隨時時間的另一裝置通過配置的端口發送一個消息,該消息「從UART接收的數據」。從不顯示。
有沒有解決這個問題的建議?另外,系統如何將中斷與串口聯繫起來?我已經閱讀了關於signal.h的內容,但是我還沒有找到答案。我從這個頁面得到了中斷的想法:http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html
在此先感謝您的幫助。 在此先感謝。
1)我不會在ttyS初始化完成之前安裝信號處理程序。2)你不應該從信號處理程序調用printf(); printf()是不可重入的。 – wildplasser 2013-02-27 20:09:11
感謝您的回答,但是根據您的意見,「中斷」仍然無效。還有什麼想法? – gus 2013-02-27 23:36:03