…一一一第4期 郏存红等:用Visual C++实现实时数据采集 l03 用Visual C++实现实时数据采集 郑存红 ,胡荣强。,赵瑞峰 (1.武汉理工大学电信学院,湖北武汉4300713;2 武汉市第七二二研究所.湖北武汉430079) 摘要:介绍了在数据采集系统软件中使用Visual C++的多媒体定时器实现对车速脉冲采集的精确定 时,定时分辨率由乐统定时器的55ms提高到lrra。 美键词:多媒体定时器;LeO操作函数;数据采集;分辨率;车速脉冲 中图法分类号:TP319 文献标识码:A 文章编号:1001・3695(2002)04-0103-02 Date Acquisition System Programming with Visual C++ ZHENG Cun-hong‘,HI T Rong—qimag ,ZHAO Rui-fe (1 lmtitute of 耐椭 &cc—L .Wu/um b'n/ ̄mtyofSc/enct詹Teeh ̄4ogr,Wu/w ̄Hahn 430070.c 眦;2. 衄 n … tf4e', ̄ ImtLt ̄e.Wdma胁 43DO79,咖加】 Abetraet:The usage ofmultimediatimerinVC pr ̄erttedinthe paper,Itmainlyintrodue*.s usingmultimediaI ̄llerto reali∞precise n g in date acquisition s) ̄tem,出 which出e timing resolution earl be improved缸粕55,ns to h∞ Key r1ds:Multimedia Timer ̄I/O Operating Ftmetion Date Acquisiiton;Resohttion;Pulse BIOS使用中断08H更新存于BIOS数据区的两个计数器 1 引言 变量TIMER-II)和TIMER-HI。因此.这个定时器在Win. 数据采集一般是采用软件或硬件的定时中断并通 dows中的最大缺点是计时器的最大分辨率是55毫秒, 过A/D来读取外界传感器的数据。通常实时数据采集 也就是说应用程序每秒最多能接收到18个消息。此 系统要求是定时准确,即采样间隔具有较好的一致性: 外,这个计时器消息的优先权太低.只有在所有的消息 实时数据采集系统过去一般是在DOS操作系统下 (除了消息WM PAINT)被处理后才能被处理。因此函 应用汇编语言或C语言开发。Windows操作系统的普及 数Set'rimer只能用于~般的定时,它远远不能满足实时 应用,尤其是可视化开发软件Visual C++的出现.为软 数据采集的要求:本文重点介绍的是多媒体定时器: 件开发提供了强大的图形界面功能.使得对数据采集进 它使用自己单独的线程(Thread).来调用~个自已的回 行图形化处理更为方便,开发出来的应用程序具有良好 调函数(Callback Functi。n)。它的优先级高.每隔一定时 的人机交互功能。汇编语言的特点是难调试,而高级语 间就发送一个消息而不管其它消息是否执行完:此外. 言具有良好的可读性及方便的调试手段 对于现在的Intel CPU来说,它的最小定时精度通常都可 本文采用美国微软登司推出的Visua/C++为软件 达到1毫秒,足够满足实时数据采集的定时精度一 开发工具采样间隔用多媒体定时器进行精确定时,并 Visual C++6.0作为C++的可视化编程工具,具 采用Visoal C++提供的端口操作的操作台函数进行硬 有C语言对硬件操作的能力。它提供了大量的操作台 件I/0编程。 函数。侧如:从端口地址读取数据的函数inp(读字节), inpw(读字), inpd(读双字)和向端口写操作字和赋初 2多媒体定时器和硬件接口函数 值的函数outp(写字节), outpw(写字), outpd(写双 字)。 inp, inpw, in口d三个函数的参数均为地址变 Visual C++提供,两种定时器。~般常用的是系 统计时器.它使用函数SetTimer进行初始化.应用程序响 量.返回的是落地址口读取的数据: outp. outpw, 应SetTin ̄er函数发送来的消息wM TIMER。这个定时 outpd三个函数的第一个参数是地址,第二个参数是需写 器是IBM PC硬件和ROM BIOS构造的定时器逻辑的~ 入地址的数据。读端口地址的三十函数原型分别是: int一 np(unsigned short port): 个相当简单的扩展。PC的ROM韧始化Inte18254定时器 unsigned short‘ 州(uns g¨edshort ponj 一芯片来产生硬件中断08H:中断响H频率为1.19361816 … edlong—inpd(u ̄iotdeshort port); MHz/635536:18.2Hz,即每隔54 925毫秒产生一次: 向端口地址写数据或命令字的三个函数原型分别 如下: iat—D p( ̄-igned short P ,int d且tBby J; 收稿日勰:2001.05-02 u心g short~ ̄tOw(u ̄inged shorl port, gDed sh0n d awoId 辫蜷 矗蒜 i圭 维普资讯 http://www.cqvip.com
104 计算机应用研究 2002正 unsigned tong oh[Pd(unsigned short port unsinegd tong dataword 1 举例来说,对端口地址0xAddress写入字节数据 0xData是一块中说明消息处理函数:afx msg LRESULT OnMyamg・ Timer( ̄ARAM wParam,LPARAM 1Param);在类实现的 消息映射块中,使用ONMESSAGE宏指令将消息映射 —outp(0xAddress,OxDa ̄),而若从该地址读取字 一节数据,则用inp(0xAddress)。 到消息处理函数中:ON MESSAGE(MYMSGTIMER, —3 Visual C十+多媒体定时器的编程实现 3 1 添加Windows 95多媒体定时器 多媒体定时器可直接用Component Gallery在项目中 插入Windows Multimedia组件,此时多媒体定时器所需的 头文件和库将自动插人【程的Stdai ̄x h中。 OnMymsgTimer):最后在相应类中实现消息处理函数。 (6)定时器的任务完成后,要及时删除,否则占用太 多内存,系统会越来越慢 删除定时器分两步:首先调用timeKillEvent函数删 除定时器旬柄;然后用timeEndPeriod函数删除定时器的 分辨率。具体应用如下: ti ̄KillEvent(TierID); —3.2多媒体定时器的应用 (1)定义定时器参数 #define TEN #define['IMER—tlmeEndPeriod(wAec ̄y/; 本节所用所有函数的使用可参阅Visual C++提供 的在线帮助。 L『l1一SECOND 20O//定时器间隔 ACCURACY I//定时嚣精度 UINT Timer ID://定时器句柄 UINT wAccumcy;//定时器精度参鼓 4用Visual C++对硬件l/0操作的编程实现 本文以车速脉冲信号采集系统为例,在对车辆车速 进行测试时,可在车辆后部装一个带齿盘的测量轮,在 齿盘侧面安装反射式光电传感器,齿盘的转动使传感器 感应出正弦信号,经计数器计数每隔一定时间数据被锁 存器锁存后,由并行接口8255送人Pc,经过换算后可求 出车速,测量轮为从动轮,测量轮的圆周速度就是车速 V=2 Il’ (2)通过多媒体定时器设备函数timeGetDeviceCaps 获得本微机的最大分辨率 TIMECAPS {//定时器分辨辛的结拘 H(timeGetDevieeGaps(&re.size TIMECAPS)/ ==耵MERR NOERRORI ,/获得本系统的最小定时器分辨率 ,,所有直用必颓太于等于诙分辨率 w a眦、 mln( mx(te wPeriodMin. 式中,d为测量轮半径;N不测量轮平均转速(r/min): 如齿盘旋转一周传感器感应P个脉冲.微机每隔t TIMER ACCURACY). w nod ax);//设定本应用的所需的定 时器分辨卑.本例为微机的所允许的最大分辨率 timeBeglaPeriod(whceu ̄y); 秒读一次计数器值.若计数器值为C下式成立: C=P-t-N/60 I 21 求出转速N带人式(1)可求出车速v: (3)应用多媒体定时器的timeSetEvent函数设定事件 的触发方式 它的函数原形是: MMRESULT timeSetEvent(LINT uDehy.UINT uRe ̄lutlon. 1p'flmePt ̄.DWORD dwelt.UIh'r fuEven 实现电路原理如图1所示。 参数说明: uDelay用于设定事件触发l 隔; uResoluti。n用于设定程序所需的晟小分辨章; 】p mePT 调用回调函数i d训 用户提供的回调数据; fuEvent事件触发方式; 在Visual C++中有两种方式: TIME ONESHOT事件仅触发一次 IME PERITODIC每隔一定时间触发一次 TimeSetEvent函数返回定时器句柄,具体应用是 Timer ID=timeSc4Event LLISECOND.wAccur y, (TENMI。—(LPTIMECALLSACK)CatchMMTimer. (DWORDIh d.TIME PER【(】DIc); (4)声明一十全局的回调(Callback)函数 (UINT wqhmerlD.UINT nMsg.DWORD dwU .DWORD dwl,DWORD dw2). 图1 车速脉冲信号采集系统图 (1)定义控制口地址变量和计数器0高低字节变量 unsigned short CtdPort;//控制口变量 uns ed int dataA,dataB;//高低字节变量 在回调函数中调用事件触发消息且在回调函数中 语句尽量简单,不要在回调函数内做一些耗时的操作。 (5)添加用户消息CatchMMTimer函数,用来接收多 媒体定时器的事件通知 其过程是首先在类的头文件定义:#define MYMSG —并在类的构造函数中赋命令口地址值受初值 CtdPon:0x303: datact=0; datab=O: TIMERWM USER+101,然后在类头文件的AFX MSG (2)初始化8255时,给本芯片的控制(下转苇108膏) ~一—■ 瓣聪蚕隘鞠i 藕圈豳 毳 矗≤{ 麓一 维普资讯 http://www.cqvip.com
・108 计算机应用研究 2002挂 Jrun的默认安装包括Jrun Admin Server与Jrun Default Serve 其中,Jmn Admin Server主要用来可视化管理 Jrun。系统中用Jrun Default Server作为系统的Jru ̄t Serv— er,将IIS连到Jrun Default Server上。 系统运用J2EE技术,选取Jrun作为Java应用服务 器,设计了农资电子商务网的一个基本框架,为中小型 企业建立基于J2EE平台的电子商务系统,提供了一种 新思路。 参考文献: [1]扬千里,王肓民.电于商务技术与应用[Mj北京:电子工 业出版社.1999 2][美]Cay S norstmann Gary-GomeH.Java 2棱一 技术[M]. 北京:机械工业出版社.2OOO [3]万助盛.候文永J2EE企业计算平台[J]计算机应用研 图2系统平台体系结构 究,2000,17(121:38.39. 【4]Anne Tho11{i,o8}Patricia Scybold Group Enterprise Java Bens Teehnolo ̄,【EB/OL]http://ja a.SUt1.com/woducts/ejb/ white-paper html 1998 综上所述,经过对系统实际需求的分析,农资电子 商务网采用基于J2EE的JSP+Ser,.,let+E_b+Jdbe的三层 结构。综合考虑经济与安全的因素,系统以NT4.0为基 础,应用服务器采用Jrun3 0 1:JrunWeb Se r是一个 小型的Web服务器,是Jmn用来测试与开发应用所用, 一[5]Sun Microsystems,Inc.Java 2 Platform Enterprise Ediiton SpeciifcationlZ一,vl 2 Publie Draft,1999 作者简介: 常晋艾(1955一),男,副教授,主要研究方向为空1日]姨策支持系 统、数据库系统应用、电子商务。1光健(1976-),助教,主要研究 方向为计算机时络应币与电子商务 般不能作为企业Web站点的直用:因此,系统采用微 软的IIs4.0作为Web服务器,将Jrun作为IIs的插件,将 IIS4.0连到Jrun Server;数据库采用Sybase。 {上接第104再)口地址赋操作命令字并赋韧值『珈tidize8255( 0u (CtrJPort.0x92)I//写命令字A,日口辅^,C口辅出 oulp(CtdPo ̄-I,0xOI);//计数清O 实现计数值的连续实时采集。OnDataStop()函数完成定 时器的删除工作: 所有操作完成后,通过编译连接并生成执行文件 inp函数读出各地址的值,读数之前先锁存 计数值再读数 一(3)用后,该程序将按用户设定的时间间隔从8255端口读取传 感器所采集的脉冲数据: 5结论 Visual c++实现实时数据采集系统的主要关键是 保证定时器的定时精度和对数据采集卡等硬件LeO接 口地址数据的读写操作。本文利用了Visual C+十6.0 的多媒体定时器和硬件操作函数大大提高了实时数据 的采集精度。使多媒体定时器的定时精度可达到l毫 秒,可以满足绝大部分实时数据采集系统的定时要求。 参考文献: [1]姚燕南微型计算机原理[M]西安:西安电子私抗大学 出版社.1997. vmd Re J Dala() 一outpfC ElfPortI-】,0xS0);/ 锁存74LSl17 一山t丑l =inp(Ox301):,,读取8255B口,即计数的个、十位 dataA=iap(Ox300);//读取8255A t2.即计数的千、百位 一ou (0x302,0x01);//通过写c口使计数器请0; 根据前面的内容,我们在Visual C++的工作台上 用New建立一个新的MFC AppWizard(exe)项目Project。 在Resource View资源Menu的IDR MAINFIL ̄.ME中添加 个弹出式菜单,在Caption中填入“数据采集”,然后在 两个菜单项的Capdon中填入 开始”、“结束”并分别定义 ID为IDDATA START和ID DATA STOP。用鼠标右 击菜单,并在弹出的浮动菜单上选择CIassWizard进入 一—[2]马明建数据采集与地理技术[M].西安:西安交通大学 出版社.1998, 3]刘乐善,叶永坚微型计算机接口技术噩应用[M]武汉: 华中理工走学出版社,1996. 【4 J Stephen D Gilber ̄,Bill McCa ̄y Visual C t+6 Programming MFC CIassWizard中的Message Maps中定义消息处理函 数,在Class Name中选择文档类,在Object Id日中分别选 择ID DATA START和ID DATA STOP,在Messages中 Blue Book:The Cofiol ̄s Group[z] [5]Robert D.21aompson The MFC Programmer’s Reference:Ven- t ̄ns.Commun ̄cal Jon Group[Z] 双击Command并接收缺省的函数名OnDataStart和0n- DataStop。点击Edit Code按钮,VC将光标自动定位到所 定义的函数。在文档类的头文件中定义一个全局回调函 数和程序所需要的地址和数据变量,并按第3节的过程 设置定时器参数,在OnDataStart()函数中启动多媒体定 时器,完成对硬件的初始化。多媒体定时器每隔一定的 作者简介: 郑存缸(1977.),士,硕士生,主要研究方向为计算机控制噩应 用;胡荣强(1946-),男,教授、博士生导师,主要研究方向为计 时间间隔在回谪函数中调用自定义的Readn日tB()函数, 算机控制及应用、智能控制;赵瑞峰(1975.),男,工程师,主要 从事通信技书、计算机应用曲研究。 藩戳 穗爵; 誊{
因篇幅问题不能全部显示,请点此查看更多更全内容