Linux下利用信号的异步串口中断响应

Posted w7849516230

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下利用信号的异步串口中断响应相关的知识,希望对你有一定的参考价值。

    先悔过一下。因为一个月前就在学习这个,当时解决的差不多了,想着抽个空再记录这些,没想到这么短的时间就已经忘得

差不多了,真是不好,应该趁热打铁。废话不多说了,这里主要介绍在Linux下,利用信号来实现异步的串口中断响应。主要思路

很简单,首先是关联信号,在此是关联处理SIGPOLL;其次是等待指定的信号。
    异步I/O的实现有很多方式,【2】中提了几种,还有较新的epoll,和Poll本质上差不多。但本人当时尚不理解这些,没有明

白select、Poll等的具体做法,也采用了多线程。其实万万不该,由于逻辑处理的不好而导致的程序不可预测性太多,因此不太

同意【2】中的观点,只是用来参考使用了。但我这里讲的做法也是在多线程条件下的异步串口通信。
    Linux下信号的概念、原理以及初步的应用【1】中的上、下已经讲解得非常到位了,仔细读读都能找到自己所需要的。下面

具体记录我的实现过程。
    (1)关联信号。
     首先是利用sigaction函数来将指定的信号与处理函数关联,以及通过fcntl函数确定是在哪个线程中,关联哪个设备文件。

那么先是sigaction函数的原型:int sigaction(int signum,const struct sigaction  *act ,struct sigaction  *oldact);

其中struct sigaction 中的内容意义可以看【3】,
        struct sigaction sact;   
        sigemptyset(&sact.sa_mask);             //一般都先清空关注的信号集
        sact.sa_flags=SA_SIGINFO;  //信号的附加信息传递开关,可以在信号SIGIO上传递附加信息,其实就是

//区别POLL_IN,POLL_OUT,为什么要使用附加信息,自己试试SIGIO信号就知道了,它是读写不加区分的
 sact.sa_sigaction=signal_action; //信号处理函数,由于利用了信号附加信息,函数原型为
//void handler(int signum,siginfo_t *info,void *context);关键是siginfo_t结构体中的si_code,其中存储了POLL_IN等。
//到时候利用info->si_code== POLL_IN或POLL_OUT在串口有读或写时做相应的处理
好了,利用sigaction(SIGPOLL,&sact,NULL);完成信号关联;再通过下面的操作完成指定的设备文件、线程
       fcntl(fd, F_SETOWN, tid);    //tid就是获取的线程号,嵌入式环境下可以使用syscall(SYS_gettid);  
       fcntl(fd, F_SETSIG,SIGPOLL );    //关心SIGPOLL信号
       fcntl(fd,F_SETFL,O_ASYNC|O_NONBLOCK);   //异步的
     (2)等待信号
      其实按照上面的做法,完全可以达到当串口有指定数据时进行相应的处理,只要指定的线程在,信号处理函数将会一直起

作用。另一种做法是在接收线程等待信号的发生,而后做相应的处理,自认为双保险,其实很混乱,只是记下来。注意的是在信

号等待或者屏蔽函数中要区分是对线程起作用的还是作用在进程上的。【1】中和【6】中说了很多,我这里只是用到了在线程中

等待信号传递过来的函数sigwaitinfo(),要是想加上时间限制也可以使用sigtimedwait();函数原型:
int sigwaitinfo(const sigset_t *set,siginfo_t *info);按照man中的说法只有当你指定的信号(在参数set信号集中)被传递到使用这个函数的线程时,该函数返回,并将信号的信息存储到后面的info中,也可以供你使用。
     (3)嵌入式环境下,在编译的时候会遇到【4】中的莫名奇妙的问题,其实加上编译开关选项即可-D_GNU_SOURCE,原因么自己看【5】了。
      好了,就这么多了,其实啥也没说,只是把一些可能用到的提了下,跟着路线走,应该能找到自己需要的了。写得太烂了,谁叫给忘得差不多了!@@@
学习参考文献:
【1】http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
【2】http://blog.csdn.net/boldeagle/archive/2008/10/18/3095930.aspx
【3】http://baike.baidu.com/view/1748537.htm
【4】http://bbs.chinaunix.net/thread-1731238-1-1.html
【5】http://hi.chinaunix.net/?uid-483016-action-viewspace-itemid-42665
【6】《Unix环境高级编程》

以上是关于Linux下利用信号的异步串口中断响应的主要内容,如果未能解决你的问题,请参考以下文章

Linux串口编程(中断方式和select方式)

Linux信号机制

我的机器10个串口为啥在linux下只读两个

Unix信号机制的简单介绍

串口传输用不用使用多线程 为啥

Linux信号信号处理和信号处理函数