当前位置:首页 期刊杂志

QSocketNotifier在端口监听中的应用

时间:2024-05-19

胡军锋 尤泽萌

(山东省海洋环境监测技术重点实验室 山东省科学院海洋仪器仪表研究所,山东 青岛 266001)

0 引言

嵌入式操作系统异军突起,在工业监测、智能家电、军用等各个领域中应用越来越广泛。嵌入式操作系统目前比较流行的就是Linux 与WinCE。由于WinCE 为微软开发,代码不公开,使用上移植行就比较差,并且收费。而Linux 内核代码是完全开源的,免费使用,其代码方便移植、安全性高、稳定性好、效率高,同时支持嵌入式CPU,如POWERPC、ARM、X86、MIPS 等,故得到广泛的应用。嵌入式Linux 中图形开发软件主要有Qt[1]与MiniGui[2]。前者是基于C++后者是基于C的。使用Qt 开发的软件,相同的程序代码可以在任何支持的平台上编译与运行,无需修改源代码。Qt 可用于各种类型的设备和产品,从智能电器(移动电话、路由器和机顶盒)到工业控制设备(如医学成像设备、移动信息系统等)。MiniGui 最初是用于工控设计的,其小巧、高效率特点适合于简单界面界面开发。

本文介绍的基于嵌入式操作系统的气象监测系统使用的是嵌入式UBUNTU 系统,移植了当前最流行的图形化开发软件Qt4。系统需要同时监测各种气象要素,如风速、风向、温湿度、气压、能见度、降雨量、太阳辐射度等等气象参数。每个气象参数一般对应着一种智能传感器,这种智能传感器很多都是具备串口通讯的。目前Qt4 之前版本中有关串口通讯类软件还没有,比较常用的是第三方的串口类软件和创建常驻线程的方式来实现。第一种方式问题就是移植起来比较复杂。第二种方法需要程序员对于内核调度有深入了解,否则在使用线程的时候容易造成系统崩溃。所有鉴于上述情况本文介绍使用QSocketNotifier 类来监听来自文件的数据,实现串口编程。QSocketNotifier 类封装了Linux 内核对于底层端口的操作,使得用户不需要去了解底层的各种的结构体,是程序开发变得更加容易,更易理解。

1 软件原理设计

Linux 中所有的外设都被定义为某个文件,对外设的操作也就是对于其文件进行相应的读写操作,所以对于串口操作也是对于相应的文件进行操作。QSocketNotifier 类对应三类事件:QSocketNotifier::Read,QSocketNotifier::Write,QSocketNotifier::Exception。由于采集来自串口的数据,这里只使用QSocketNotifier::Read 事件。每个QSocketNotifier 对象只对应着一个监听事件,如果需要监听多个事件,那么就要创建相应的QSocketNotifier 对象。与传统的线程方式相比,大大简化了程序代码,由于与操作系统完全隔离,使得程序更加稳定。假设需要检测来自风传感器、温湿度传感器和压力传感器的数据。那么我们需要创建三个单独QSocketNotifier 对象,通过相应的Qt 事件信号机制来实现。

图1 软件流程图

首先系统初始化打开温湿度、大气压力和风传感器对应的串口文件,同时设置文件通讯波特率。然后创建3 个QSocketNotifier 对象,分别用来监控来自温湿度、大气压力和风传感器信号,当监听到某个文件有数据传来,先判断是否是键盘等其他事件,如果是则进入相应的键盘及其他事件处理函数。判断是否是串口事件,如果是其对应的QSocketNotifier 就会发射ativated 信号,然后进入相应的slot 处理。使用QSocketNotif 类最大好处是让程序开发者不用去详细了解Linux 操作系统后台是如何处理串口数据的,只要有数据来就会触发ativated信号,进入每个串口所对应的函数操槽去处理。如果没有事件发生,系统继续等待事件的发生。

2 软件编程实现

第一步:打开大气压力、温湿度、风传感器对应的文件,设置相关波特率。

第二步:为每一个需要监听的串口创建QSocketNotifier 对象。如下所示

3 结束语

本文简要介绍了基于QSocketNotifier 的串口监听方式,这种方式相比起第三方串口类,其编程比较简单,易于初学者使用。缺点就是Qt3.0 以前版本中没有QSocketNotifier 类,只有Qt4.0 以后的版本才有。

[1]姚福鹏.嵌入式数据库在QT/中的应用与研究[J].国外电子测量技术,2010,9:73-79.

[2]张升,陶维青,黄林.嵌入式图形开发界面MinuGui[J].仪器仪表用户,2013,2.

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!