APP下载

Qt/Embedded串口类的设计及应用

2010-03-03陈旭红高文学

湖北汽车工业学院学报 2010年4期
关键词:类库缓冲区C语言

陈旭红,高文学

(1.湖北汽车工业学院,湖北 十堰 442002;2.陕西广播电影电视局,陕西 延安 716000)

Qt/Embedded串口类的设计及应用

陈旭红1,高文学2

(1.湖北汽车工业学院,湖北 十堰 442002;2.陕西广播电影电视局,陕西 延安 716000)

针对Qt/Embedded类中没有提供串口基础类的现状,研究了Qt/Embedded与串口信息交互的方法,并给出了Qt/Embedded串口类的实现及Qt/Embedded串口类在工业控制中的应用实例。

Qt/Embedded;串口;信息交互

在工业控制项目当中经常使用Qt/Embedded类库开发界面控制应用程序,作为应用控制端一般使用RS232总线与控制设备进行通信,但是在Qt/ Embedded类库中没有提供串口的基础类,这就需要在项目应用中编写基于Qt/Embedded的串口基础类。本文对基于Qt/Embedded的串口基础类进行类定义及应用测试。

1 Qt/Embedded简介[1]

Qt/Embedded是Trolltech公司开发的面向嵌入式系统的Qt版本,与X11版本的Qt在最大程度上接口兼容,采用帧缓存(framebuffer)作为底层图形接口。Qt/Embedded类库完全采用C++封装,并且有着丰富的控件资源以及较好的可移植性,大范围的Qt/Embedded API可用于多种开发项目。在工业控制项目当中会使用大量的串口通信,但是Qt/ Embedded没有提供与串口硬件的接口。

Qt/Embedded的底层图形引擎基于 framebuffer。framebuffer是一种驱动程序接口,它将显示设备抽象为帧缓冲区。该驱动程序的设备文件一般是/dev/fb0、/dev/fb1等。对用户而言,它和/dev下的其他设备没有什么区别,用户可以把framebuffer看成一块内存,既可以从这块内存中读取数据,也可以向其中写入数据,而写操作立即反应在屏幕上。Qt/Embedded是 Qt的面向嵌入式应用的简化版本,为运行Qt/Embedded,嵌入式Linux内核要支持framebuffer。

它包括一组完备的GUI类、操作系统封装、数据结构类、功能类和组合类。大部分Qt的应用程序可以经过简单的编译与重设窗口大小移植到Qt/ Embedded。Qt/Embedded的实现结构如图1所示。

图1 Qt/Embedded实现结构图

从Qt/Embedded的结构中可以看出,Qt/Embedded支持鼠标、键盘、触摸屏和网络等输入输出接口,但是不具有串口基础类。

在Qt中,对象间通过信号和槽的机制实现彼此通信。信号/槽机制是Qt的核心机制,是一种高级接口,主要应用于对象之间的通信。Qt的信号/槽机制独立于标准的C/C++语言。在Qt中,从QObject或其子类(例如Qwidget)派生的类可拥有自己的信号和槽。当对象改变其状态时,信号就由该对象发射出去,从而实现了信息封装,以确保对象被当作软件组件来使用。槽用于接收信号,体现为普通的对象成员函数的形式。槽和信号的连接由程序设计者完成,只有当设计者利用connect()将信号和槽连接起来后,信号和槽之间才会有上述的通信。信号和槽的机制使得各个对象之间的协同工作变得十分简单,在本串口类设计中就使用了Qt的信号和槽的机制(见3.3节)。

2 Qt/Embedded使用串口的方法

在Qt/Embedded 2.3.10在开发中使用Linux作为操作系统,Linux操作系统对网络和硬件操作都具有很好的支持。

2.1 使用Qt/Embedded和C语言操作串口

Qt/Embedded对网络具有良好的支持,而Linux下的C语言对网络和硬件都有很好的支持,因此可以使用C语言建立TCP Server,Qt/Embedded使用网络接口与TCP Server连接,通过C语言的串口操作来完成Qt/Embedded对串口的操作[2]。其操作结构图如图2所示。

此方法比较复杂,需要定义内部通信协议,故一般不使用这种方法。

2.2 使用Qt/Embedded直接操作

Qt/Embedded类库完全采用C++封装,但是支持使用Linux标准C语言类库,可以在Qt/Embedded应用程序中使用Linux标准C语言类库对串口进行操作。

图2 Qt/Embedded操作结构图

3 串口类的设计

C语言对硬件的操作一般使用阻塞读取和查询的方法读取数据,而在Qt/Embedded中使用信号与槽无阻塞操作。因此要在Qt/Embedded中高效的运行程序,必须把对串口的操作设计成无阻塞操作[3]。在Qt的串口类设计中,串口传输的差错控制由硬件来保证;而缓冲区的溢出根据应用而定,当检测到缓冲不足时,按照一定的比例自动增大缓冲区,从而避免了缓冲区溢出。

3.1 设计分析

要把串口类设计成无阻塞操作的类,就必须像Qt/Embedded中QSocket类一样提供void QSocket:: readyRead()信号供应用程序使用,以读取信息。为了类似实现void QSocket::readyRead()信号,可以借助QSocketNotifier类。在Qt/Embedded 2.3.10版本中QSocketNotifier支持对所有套接字的回调,QSocketNotifier支持对设备的读、写和错误状态的回调。其原型为

3.2 类的定义

图3 QSerialSt定义图

为更加方便设置串口参数,定义了串口参数结构体QSerialSt,QSerialSt定义如图3所示。

QSerial类的结构如图4所示,串口配置主要由init()函数传递的串口参数结构体QSerialSt来完成。QSerial类的写串口可以调用writeBlock()函数,信息读取可以使用readyRead()信号。

图4 QSerial类的结构图

3.3 类的实现

QSerial的构造函数QSerial()对变量进行初始化,析构函数~QSerial()关闭套接字。串口的初始化主要工作流程图如图5所示。

图5 串口的初始化主要工作流程图

初始化成功后可以产生一个套接字,并返回一个正确码。配置串口的过程主要有以下步骤。

1)调用openDev()函数打开串口设备,设备名可以从参数传递,打开设备成功后进行下一步,如果打开设备失败返回错误码;

2)调用setSpeed()函数设置串口波特率;

3)调用setParity函数设备奇偶校验,如果设置成功返回正确码,如果不成功返回错误码。

信号 readyRead()由槽 dataRead()触发,而dataRead()连接在QSocketNotifier上,当设备有数据可读时会回调dataRead()函数读取数据并触发信号readyRead(),通知上层读取数据。代码如下:

4 应 用

4.1 使用QSerial类的主要步骤

1)初始化QSerialSt结构体,设置串口信息。

2)调用init()函数传递初始化好的QSerialSt结构体进行串口设置,检测返回值判断初始化是否成功,并做相应的处理。

3)初始化成功后调用setNotifier()函数,设置串口回调函数。

4)连接QSerial类的readyRead()信号,供应用类读取数据。

4.2 QSerial类应用示例代码

4.3 QSerial类应用实例

图6 车载显示终端主界面

车载显示终端中使用QSerial()串口类,完成了显示终端与下位机通信的串口通信。图6是车载显示终端主界面,可以实现的工作主要包括:1)刷新数据显示:需要刷新的数据包括速度、限速、信号机编号和类型、距信号机距离、时间等;2)刷新状态指示显示:包括当前色灯以及屏幕右边的各种状态指示;3)刷新图形显示:根据当前的数据,画出前方4 km和后方1 km的速度、限速曲线以及平纵断面和道桥隧等。4)车辆位置显示:主界面左侧约1/5处有一条垂直分割线,表示此处为当前机车位置。

5 总 结

本文定义的QSerial类具有易于使用、占用较少的CPU资源、接口规范、串口配置过程简单和数据读取容易等特点。QSerial类已在多个工业控制项目中使用,经过反复的实验测试,QSerial类在Linux 2.6.21内核和Qt/Embedded 2.3.10的环境下能够长时间稳定工作。

[1]QT2.3白皮书[EB/OL].[2010-10-28].http://www.trolltech.com.

[2]于明俭,陈向阳,方 汉.LINUX程序设计权威指南[M].北京:机械工业出版社,2001.

[3]袁鹏飞.24小时学通qt编程[M].北京:人民邮电出版社,2000.

Design and Application of Qt/Embedded Serial Port Class

Chen Xuhong1,Gao Wenxue2
(1.Hubei Automotive Industries Institute,Shiyan 442002,China;2.Radio Film&TV Bureau of Shaanxi Province,Yan’an 716000,China)

The information interaction between Qt/Embedded and serial port was studied.The serial port class was realized in Qt/Embedded.An applying example of the serial port class in the industrial control was given.

Qt/Embedded;serial port;information interaction

TN316.2

A

1008-5483(2010)04-0051-03

10.3969/j.issn.1008-5483.2010.04.013

2010-10-28

陈旭红(1970-),男,湖北应城人,硕士,从事电子技术方面的研究。

猜你喜欢

类库缓冲区C语言
基于Visual Studio Code的C语言程序设计实践教学探索
用Java编写客户机/服务器端应用程序
Python在数据可视化中的应用
基于C语言的计算机软件编程
数据结构课程教学改革方案和应用效果
数据结构可视化类库的设计与实现
基于网络聚类与自适应概率的数据库缓冲区替换*
嫩江重要省界缓冲区水质单因子评价法研究
高职高专院校C语言程序设计教学改革探索
关键链技术缓冲区的确定方法研究