在应用物理学科的“数字化压力测量”实验装置中,使用了模拟电路,数字电路,传感器与单片机等学科技术知识。为了完成数据采集与分析,单靠单片机技术所构成的硬件系统架构,虽然可以做到实时的监控,但不利于数据处理的深化与更加深入详细分析的表达,数据的记录也会带来误差,为了解决这些问题,让学生能更好的领略到数字化时代的知识,在完成数字化压力测量检测仪的基础上,提出本课题的设计与实现。
PC机具有强大数据处理,图像显示以及实时监控的能力,利用PC机的这些特点,同时编写友好的应用程序来实现数据的采集与分析,具有特殊意义——能够提升整套测试系统的处理能力的上位机得以呈现。
Qt提供的C++应用程序开发框架,可以轻松实现“一次编写,随处编译”的跨平台解决方案,编写的应用程序能完美运行于从windows 98到windows 7,从Mac OSX到Linux,从Solaris,HP-UX到其他基于X11的众多Unix平台上。
这让编写的应用程序可以运行在不同的系统,很大程度上方便移植。
1 总体架构设计
软件整体架构包括完善的菜单栏、启动画面,工具栏,状态栏和应用程序主界面。软件架构如图1所示。
由启动画面进入程序主应用程序,主应用程序初始化界面提供一些必要的操作说明,单击清除按钮将会清除说明,然后进入具体应用程序配置,配置完成一些工具按键进入使能状态同时另一些按键进入禁止使用状态。
软件保留一个按键作为切换测量与监控模式,具体的模式由单片机程序决定,默认为测量模式。
Qt是由C++体系实现,采用先进的信号槽机制,每一个类对应一个功能,about.cpp中的about类提供软件版本,作者和日期等信息,dis play.cpp中的Clock类提供数据回归分析曲线拟合,fader.cpp中FaderWidget类提供对整体程序弹出窗口中淡入淡出效果,mainwindow.cpp中的MainWindow类提供应用程序主体窗口,win_qextserialport.cpp提供的类用于串口配置底层驱动文件。
2 界面布局设计
2.1 菜单栏、工具栏以及状态栏的实现
菜单可以让用户浏览应用程序并且可以学会如何处理一些新的事情;上下文菜单和工具栏则提供了对那些常使用的功能进行快速访问的方法;状态栏用于显示状态提示和其他一些临时消息。
在Q1中实现这3个子窗口是相通的,原理一样,实现手法一样,只是对用户而言看上去不一样。Qt里面有一个类,叫做QAction,QAction保存有关于这个动作,也就是action的信息,神奇的是,QAction能够根据添加的位置来改变自己的样子,如果添加到菜单中,它就会显示成一个菜单项;如果添加到工具栏,它就会显示成一个按钮,QAction有一个属性适用于状态栏显示setStatusTip。通过这个属性可以设置状态栏显示信息。
example=new QAction(tr(“”),this);
example->setIcon(QIcon(“”));example->setStatusTip(tr(“”));
最后给动作添加一个槽,以便实现了信号槽connect(example,SIGNAL(triggered()),this,SLOT())。
2.2 添加控件的实现
在Qt中每一个控件对应于一个类,向窗口或控件添加其他控件只需指定相关类就完成了添加窗口的操作。
2.3 布局组件的实现
在Qt中使用布局机制来实现控件的位置定位。只要把组件放入某一种布局之中,当需要调整大小或位置的时候,Qt就知道该怎样进行调整。
Qt一共有3种主要的Layout,分别是:QHBoxLayout水平方向从左到右布局;QVBoxLayout垂直方向从上到下布局;OGridLayout在一个网格中进行布局。图2是整体效果。
3 数据采集存储显示设计
3.1 数据存储
在测量模式下通过单击获取数据按钮会获得来自单片机系统发送过来的实时测量数据。从数据显示获取系统采集的时间来精确记录数据信息。如果不需要在应用程序界面上显示,可以通过单击写入文件按钮,此时数据将会写入到具体文件中去,操作者可以保存以自己姓名学号为文件名的文件。Qt中通过QFile类访问本地文件系统或者嵌入资源,同时还要使用QTextStream类来操纵文本文件,QTextStream会自动将Unicode编码同操作系统编码进行转化。
3.2 数据分析与拟合
为了方便学生实验,通过获取每个学生实验数据进行回归分析以及拟合曲线,对应于每个button是由数据增和数据减求得平均值;学生由于误操作导致获取的数据不正确,可以通过单击删除按钮删除该数据,然后重新获取数据。学生可以通过原始数据拟合曲线和回归分析后的拟合曲线进行对比。在Qt中没有具体数据图表控件,因此需要自定义控件。
3.3 解决方案
利用Qt中绘图控件QPainter当获取每个数据时,在屏幕上打印出相对应的点,这样就能拟合出曲线如图3所示。同时利用坐标变换trans late方法重新定义原点,这样更有利于坐标的绘制。
如图3所示,首先画出网格坐标轴,然后将获取到的数据转化为相对应的具体左边打印出该点:
paint,drawEllipse(((i+1)*24)+2,-(share[i]/10/5*24)+4,-6,-6);/画点,最后由回归分析拟合出数据表达式。
4 数据库设计
QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库接口。这个接口由利用Qt的模型/视图结构将数据库与用户界面集成的一套类来集成。
本应用程序采用微软开发的SQL Setwer2005作为数据库引擎,用户界面采用Qt编写,当系统处于监控模式时,需要数据的实时监控和存储,数据量将非常大使用文件存储不适合,同时利用数据库提供的查询语句Select、修改update、删除delete等语句,可以方便地管理数据库。
5 软件美化
5.1 国际化
Qt中国际化的方式有很多种,常使用的QTextCodec类和使用tr()函数,前者将编码名称写到代码里面,除非使用Unicode编码,否者编码依然是一个问题,本软件系统设计时使用tr()函数实现应用程序的国际化。同时在main函数中增加一个QTranslator对象,这样应用程序就变成了中文。
5.2 淡入淡出效果
当窗体进行页面切换时,原页面的消失和新页面的显示并不是瞬间切换的,而是逐渐消隐和逐渐显现的过程。
本应用程序中实现的fader类就是用于实现这种效果,在响应页面切换时,新建一个窗体,此窗体是一个与对话框等尺寸的空白窗体,此窗体由透明逐渐变成不透明就完成了淡入淡出的效果,如图4所示。
6 Qt串口通信
在Qt中没有特定的串口控制类,采用第三方写的qextserialport类如图5,文件中包含QextSerialBase类,Win_QextSerialPort类,Pos ix_QextSerialPort类,QextSeralPort是所有类的子类,是最高的抽象,它屏蔽了平台特征,使得在任何平台上都可以使用。
对于串口的读取方式有Polling模式即查询模式还有EventDriven事件驱动模式。
事件驱动方式就是使用处理串口的读取,一旦有数据到来就会发出readyRead()信号,设计者可以关联该信号来读取串口数据。在事件驱动的方式下,串口的读写是异步的调用读写函数会立即返回,它们不会冻结调用线程。
而查询方式则不同,读写函数是同步执行,信号不能工作在这种模式下,但这种模式下开销小,需要自己建立定时器来读取串口数据。
Windows下可以使用两种方式而在Linux下只能使用查询Polling方式。
7 结束语
本软件测试系统界面直观、友好,数据存储方便,分组存储更能方便学生记录数据。软件能后满足实验室的测量要求,并且省去了繁琐的数据记录、处理的过程。学生可以更直观地观测压力的变化。在通信协议不变的条件下,软件和硬件平台可以分别进行改进、扩展,使其更加完善。应用程序的跨平台性,可以完美运行于各种操作系统,从Windows到Mac OS,从Linux到Unix及一些嵌入式系统上。