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

2023-05-16

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

差不多了,真是不好,应该趁热打铁。废话不多说了,这里主要介绍在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环境高级编程》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下利用信号的异步串口中断响应 的相关文章

随机推荐

  • 【常见的优化算法介绍】

    常见的优化算法介绍 1 批量梯度下降算法 xff08 batch gradient descent BGD xff09 每次迭代都需要把所有样本都送入 xff0c 这样的好处是每次迭代都顾及了全部的样本 xff0c 做的是全局最优化 但是有
  • 树莓派无显示屏 ssh 连接的方法

    一般来说 xff0c 树莓派买回来很少配置显示屏 xff0c 通常只通过ssh远程登陆来控制树莓派 而树莓派通过ssh连接有三种方法 一 通过网线将树莓派连接到路由器上 这个方法成功率极高 xff0c 我一般都是采用这种方法 1 允许ssh
  • AIRSIM 中文使用手册-2021/4/6

    AIRSIM 中文使用手册 截至2021 4 6 前言1 HomeHome日志变更 2 获取AIRSIM下载二进制文件在Windows上构建在Linux上构建Linux上的DockerAzure上的AirSim开发环境自定义虚幻环境AirS
  • 最新研究:AI已可诊断50种眼疾,1.2秒内确认神经系统疾病

    本文由人工智能观察编译 译者 xff1a Sandy 近年来 xff0c 人工智能技术与医疗健康领域的融合不断加深 xff0c 且在科技巨头与资本巨头积极布局的努力下 xff0c 智能医疗正在不断取得新的突破 而根据 自然医学 xff08
  • 如何将Set转换为Array?

    本文翻译自 xff1a How to convert Set to Array Set seems like a nice way to create Arrays with guaranteed unique elements but i
  • 小米2013校园招聘笔试题

    题目 xff1a 一个数组里 xff0c 除了三个数是唯一出现的 xff0c 其余的都出现偶数个 xff0c 找出这三个数中的任一个 比如数组元素为 1 2 4 5 6 4 2 xff0c 只有1 5 6这三个数字是唯一出现的 xff0c
  • NVIDIA Jetson NX 模组初始化(刷机+扩容)

    项目场景 xff1a 老师让我学习使用NVIDIA Jetson NX做项目开发 于是自己研究一下 由于第一次接触 前期踩坑用了两周时间 特此记录 1 刷机 使用的是NVIDIA Jetson NX 模组 xff0c 网上买大约4 5k x
  • centos+docker设置网易163镜像加速

    镜像加速 鉴于国内网络问题 xff0c 后续拉取 Docker 镜像十分缓慢 xff0c 我们可以需要配置加速器来解决 xff0c 我使用的是网易的镜像地址 xff1a http hub mirror c 163 com 新版的 Docke
  • WSL(ubuntu2204)xfce4安装中文环境和fcitx5框架及中文输入法

    安装中文语言包 sudo apt install language pack zh hans 配置中文显示 首先运行如下命令配置 locale sudo vi etc locale gen 找到 zh CN UTF 8 UTF 8 并取消注
  • detectron2: An object named ‘XXXX‘ was already registered in ‘META_ARCH‘ registry

    根据该作者 https blog csdn net qq 20793791 article details 107924375 所述的方法 xff0c 我又想到了 看我的目录文件是否是 python package xff0c 突然发现虽然
  • ubuntu20.04中python2和python3切换

    Ubuntu 20 04 LTS已经移除Python2 xff0c 默认安装python3 xff0c 但是很多时候还是会经常用到python2 7版本 xff0c 这里首先单独安装python2 7 xff0c 然后配置python2和p
  • ubuntu18.04 pycorrector安装

    今天尝试对语音识别转录后的文字进行纠错 xff0c 然后就试了一下pycorrector xff0c 在安装pycorrector的时候遇见了下面的问题 xff1a base pip install pycorrector Looking
  • libxcb-xinerama.so.0: cannot open shared object file: No such file or directory

    今天在ubutnu 18 04上装了mayavi 但是写代码可视化点云的时候出现了下面的情况 xff1a QLibraryPrivate loadPlugin failed on 34 home eric anaconda3 envs po
  • 生产者/消费者模式(转载)

    简介 在实际的软件开发过程中 xff0c 经常会碰到如下场景 xff1a 某个模块负责产生数据 xff0c 这些数据由另一个模块来负责处理 xff08 此处的模块是广义的 xff0c 可以是类 函数 线程 进程等 xff09 产生数据的模块
  • 【飞控学习】APM和PX4飞控源码下载及安装

    对于无人机开发的专业人员来说 xff0c APM和PX4是现今市面上最强大的2个开源无人机飞控 学习和查看他们2者的源码 xff0c 将会提高我们对整个无人机的姿态解算和控制的深入理解 现在我们就来下载2者的源码和安装查看2者源码的软件 1
  • Skye无人机换遥控接收机遇到的坑

    Skye的接收机是可以直接用天地飞对码的 xff0c 如果要更换接收机的话需要支持sbus协议或者要有个转码器 xff0c 要更换接收机的话要特别注意 xff0c skye主板上集成了一个反相器 xff01 如果用单片机自己做转码器的话直接
  • opencv算法移植到嵌入式平台(1): opencv工程打包成库

    1 将要用到的opencv 相关的库打包 xff0c 利用你要移植的平台第三方编译器进行交叉编译 xff0c 因为如果你利用其它编译器即使编译通过了 xff0c 在另外的工程调用时也会提示错误 xff0c 一般会报错误 xff1a unde
  • 值得你关注的Android6.0上的重要变化(一)

    伴随着众多新特性和新功能 xff0c Android6 0 xff08 API level 23 xff09 在系统和API上都有着诸多的改变 本文着重介绍几个关键变化 xff0c 以帮助你理解这些改变对你的APP产生的影响 一 运行时权限
  • 编译开源LibreOffice的Android版本——开源Office文档查看器

    项目近期需要用到文档查看器 xff0c 现有的WPS之类确实比较好用 xff0c 无奈还需要对应用做些处理 xff0c 只好寻找开源的实现 开源的文档查看器主要两种方式 xff0c 一种是完整的Android版本实现 xff0c 直接拿来即
  • Linux下利用信号的异步串口中断响应

    先悔过一下 因为一个月前就在学习这个 xff0c 当时解决的差不多了 xff0c 想着抽个空再记录这些 xff0c 没想到这么短的时间就已经忘得 差不多了 xff0c 真是不好 xff0c 应该趁热打铁 废话不多说了 xff0c 这里主要介