APP下载

基于LabWindows/CVI的数据播放器设计与实现

2012-09-26陈怀民马更生吴佳楠

电子设计工程 2012年22期
关键词:链表数据文件播放器

陈怀民,马更生,吴佳楠

(西北工业大学 无人机特种技术重点实验室,陕西 西安 710065)

在半物理仿真实验中,我们经常需要对保存的实验数据进行回放研究。像串口调试助手、网络调试助手等软件虽然可以对数据文件进行读取和发送,然而它们仅仅是对整个文件内的数据进行整体发送,而无法按我们的需求进行一帧一帧的发送。通常我们自己开发的用于数据研究的软件也只是针对某一特定的数据文件进行读取,数据文件内变量个数以及类型的改变,都要导致对软件的源程序进行修改,这样就很繁琐,并且对其他人员的使用、修改造成了一定的困难。

为了解决这一问题,利用LabWindows/CVI开发环境设计了数据播放器,可以按照实验时的真实采样过程,将实验数据发送出去,再现实验过程,可反复对实验数据进行研究。通过使用ini配置文件的方式做到了通用,只需对ini文件进行简单的相应修改,就可以播放不同格式不同数据量的文件,而无需对源程序进行修改。同时由于LabWindows/CVI可以生成MSI格式的发布(安装)文件,可以将编制好的应用程序转化为发布文件,这样可以脱离LabWindows/CVI的开发环境,将发布程序安装到任何一台计算机上[1]。

1 数据播放器软件功能

结合所需功能,在LabWindows/CVI下搭建数据播放器界面如图1所示。

图1 数据播放器界面图Fig.1 Interface chart of the data player

采用配置文件即ini文件的形式对UDP通信和数据文件的信息进行读取。为了便于对ini文件的修改,设置了“打开配置文件”按钮,可以方便的打开ini文件对其进行修改,然后将其载入。选择相应的数据文件,即可进行播放,数据可以按真实实验时的传输过程,将数据按采样间隔发送出去。为了便于对数据播放位置的调整,设置了进度条即CVI中的滚动条控件,不仅可以显示数据的播放进度,而且可以通过对滚动条的拖动改变数据的播放位置。

2 ini文件的配置和载入

ini文件是Initialization file的缩写,即初始化文件,不仅一般的应用程序可以使用ini文件,其实windows操作系统也有自己的ini文件:win.ini,保存在Windows目录下,Windows通过该文件对当前操作系统进行配置[2]。

ini文件将各种数据分成很多以“[]”组成的节,而在每一节中又包含了很多项目,项后面紧跟着一个等号,等号后面则是该项的值。实际上,ini文件中数据的存取是采用预先约定好的“项目=值”存储结i构,各种数据被分门别类的存储。ini文件的通用格式可以总结为:

在设计中将UDP通信的信息以及数据的相关信息写入ini文件,使用中只需对ini文件进行简单的相应改动就可以读取不同的数据文件。ini文件的设置如下:

其中在NetworkConfig中设置UDP通信的相关信息,如本地IP、本地端口号、对方IP、对方端口号。在DataConfig中按照数据文件的具体信息,在Key中填写数据名称,如“variable1”。 KeyValue 中 填 写 变 量 的 格 式 , 如 “double”、“float”、“int”。各变量的排列顺序完全按照数据文件内变量的排列顺序。在OtherConfig中设置帧间隔(即数据的采样间隔)和数据的存放格式。由于数据的相关信息都是已知的,所以对ini文件的修改非常容易。

对NetworkConfig和OtherConfig中的信息进行载入相对简单,不再赘述。对数据变量及数据类型的载入,定义结构体:

在载入ini文件的过程中,根据[DataConfig]中变量的多少建立数据变量的动态链表[3],建立过程中对每个节点的成员进行相应赋值,datan用于区别变量在数据中的排列位置;dataname为变量的名称;datatype为变量的数据类型;datalength为变量所占字节数;同时我们还可以得到一帧数据总的字节数length。这些和真实数据的存储都是相同的,这样就保证了数据的播放和采样接收时的情况完全相同。由于建立链表的程序较多,这里不再赘述。动态链表的建立极大方便了数据的读取和发送,对于数据变量的信息,只需按需要对链表进行遍历即可得到,而且有利于以后对软件进一步的升级。

3 数据文件的读取

以ASCII格式的数据文件为例说明数据的读取。对动态链表进行遍历,判断每个变量的数据类型,根据不同类型,分配不同的字节数,将文件内的数据按顺序写入内存。程序流程图如图2所示。

图2 数据文件读取流程图Fig.2 Flow chart of loading the data file

与ASCII格式的数据文件不同,二进制数据文件的数据无需单个读取,只需对链表进行一次遍历,分配适当大小的内存后一次性将文件内数据全部写入内存。

4 数据发送

为了使得不同任务之间的协调操作与运行、数据的交互等问题更加易于解决,程序中使用了异步定时器。不需要特殊的数据传送机制,不需要建立共享存储区或共享文件,这对于数据的读取和发送增加了很多方便,同时增强了程序的灵活性。

异步定时器的创建:

timerid=NewAsyncTimer(playspeed, -1, 0, asynCB, 0);

timerid:控件句柄

playspeed:两次事件的时间间隔,单位为秒

asynCB:自定义回调函数,产生相当于普通Timer控件的回调函数事件。

在回调函数asynCB中,要将数据中的一帧数据完整的经过UDP传输:

data=malloc(length);

memcpy (data, &wave[scrollbarposition*length], length);

UDPWrite(writerChannel, targetport, targetip, data, length);

异步定时器的时间间隔设定为数据文件的采样间隔,这样对于数据接收方来说,接收数据播放器的数据就如同接收实时采集的数据一样,完全可以模拟之前实验时的数据采集情况。

为了方便的显示和调整文件的播放进度,使用了CVI中的滚动条控件,CVI中滚动条可以通过两种方式得到:一种是利用函数ScrollBar_Create[4][5]创建,另一种方式是利用函数ScrollBar_ConvertFromGraph将绘图控件转化为滚动条。本设计选用的是第二种方式:

ScrollBar_ConvertFromGraph (panelHandle,PANEL_GRAPH_HORIZONTAL,scrollbarCB , NULL);

其中scrollbarCB是滚动条的回调函数,可以实时响应播放进度的变化并改变滚动条的位置。

滚动条有两种显示方式,分别为水平滚动条和垂直滚动条。本设计选用水平滚动条。

通过函数ScrollBar_GetAttribute和ScrollBar_SetAttribute分别获得和设置滚动条的属性值,包括滚动条的最小值、最大值、滚动条一次滚动的大小、滚动条是否与拖动的数值成比例进行设置,这些设置相对比较简单。

滚动条的函数面板在菜单的Library中并不存在,因此首先需要注意的是应该装载仪器驱动[6],然后将所需的函数面板文件scroll.fp添加到当前工程中。和滚动条一样,ini文件和异步定时器的函数面板文件inifile.fp、asynctmr.fp也要添加到当前工程中。如图3所示。

图3 添加函数面板文件Fig.3 Chart of loading the.fp file

为了使不同的数据文件可以有更好的播放效果,设计了两种播放方式。一种是改变播放间隔,采用这种方式可以使数据以自定义的速度发送出去,而且没有数据的丢失,适用于采样间隔较大、数据较少的数据文件;另一种是类似视频播放器的方式,对数据的播放可以进行“快进”和“慢放”,快进是对数据进行抽点播放,慢放则是对数据进行重复播放。

5 运行结果

采用ASCII格式的文件testdata.dat,其中包含3个变量,变量一是幅值为4,周期1 s的正弦变量;变量二是幅值为3,周期2 s的余弦变量;变量三是幅值为1,周期为1 s的三角波变量,采样周期为20 ms。

播放器运行界面如图4所示。

图4 播放器运行界面图Fig.4 Interface chart of data player run

数据接收界面采用CVI设计的虚拟示波器。示波器接收界面如图5所示。

图5 数据接收界面图Fig.5 Interface chart of the data receive

由图4的运行界面可以看到数据文件的相关信息,可以很清楚的知道播放进度。由图5中3个变量的波形可以得出,接收到的收据和数据文件内的数据完全相同,说明数据播放器的设计是可用的。

6 结束语

以上基于LabWindows/CVI的数据播放器的设计与实现,详细介绍了ini文件的配置和载入,数据文件的读取和发送,简要介绍了异步定时器和滚动条控件的使用。本设计的核心是ini文件的灵活配置以及对数据文件内的变量进行的动态链表的建立。在读取不同的数据文件时,无需关注程序本身的修改,只需根据数据文件的具体信息对ini文件进行简单的配置即可,从而节省了很多繁琐的修改程序的过程。

[1]宋宇峰.LabWindows/CVI逐步深入与开发实例[M].北京:机械工业出版社,2003.

[2]王建新,杨世凤,隋美丽.LabWindows/CVI测试技术及工程应用[M].北京:化学工业出版社,2006.

[3]谭浩强.C程序设计[M].3版.北京:清华大学出版社,2006.

[4]Nation Instruments Corportation.LabWindows/CVI Help[S].2006.

[5]刘君华.基于LabWindows/CVI的虚拟仪器设计[M].北京:电子工业出版社,2003.

[6]孙晓云,郭立炜,孙会琴.基于LabWindows/CVI的虚拟仪器设计与应用[M].北京:电子工业出版社,2005.

猜你喜欢

链表数据文件播放器
Walkman诞生40周年 索尼适时发布NW-ZX500和NW-A100系列播放器
基于二进制链表的粗糙集属性约简
基于STM32的MP3播放器设计
跟麦咭学编程
Moon ACE播放器/放大器一体机
基于链表多分支路径树的云存储数据完整性验证机制
数据文件恢复专题问答
数据文件安全管控技术的研究与实现
SQL数据文件恢复工具
播放器背板注塑模具设计