在linux中设置串口中断 [英] setting serial port interruption in linux
问题描述
我正在尝试在 ubuntu 中设置串行端口的中断(在用 C 编写的程序中),但它不起作用.我已经检查了串行通信是否正常工作而没有中断,所以我可能设置错误.代码如下:
I am trying to set the interruption for a serial port in ubuntu (in program written in C), but it does not work. I have checked that the serial communication works correctly without the interruption, so I may be setting something wrong. The code is the following:
#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
");
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....
");
connected = 1;
while(connected == 1){
// some code
}
close(fd);
exit(0);
}
void signal_handler_IO (int status)
{
printf("received data from UART.
");
}
所以任何时候另一个设备通过配置的端口发送消息,消息从 UART 接收数据".从不显示.
So anytime time another device send a message through the configured port, the message "received data from UART." is never displayed.
有解决这个问题的建议吗?另外,系统如何将中断与串行端口联系起来?我已经阅读了有关 signal.h 的信息,但我还没有找到答案.我从这个页面得到了中断的想法:http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html
Any suggestion to solve this problem? Also, how does the system relate the interruption with the serial port?, I have read about signal.h but I have not found an answer for that. I got the interruption idea from this page: http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html
提前感谢您的帮助.提前致谢.
Thanks in advance for any help. Thanks in advance.
推荐答案
问题是您通过使用 F_SETFL
FASYNC 标志来禁用来自文件描述符的信号>.如果你想获得信号,你需要设置它:
The problem is that you're disabling signals from the file descriptor by clearing the FASYNC
flag with F_SETFL
. You need to set that if you want to get signals:
fcntl(fd, F_SETFL, FNDELAY|FASYNC);
此外,您可能希望对这些标志使用 POSIX 名称(O_NDELAY
和 O_ASYNC
),而不是 BSD 名称以获得更高的可移植性,尽管两者都适用于 Linux.
Also, you might want to use the POSIX names for these flags (O_NDELAY
and O_ASYNC
) rather than the BSD names for more portability, though either will work on Linux.
这篇关于在linux中设置串口中断的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!