




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用VC 6 0编写数据采集及控制程序 程序要求用VC 6 0编写一个数据采集及控制程序 按一定的频率获取采样仪器传送给计算机的数据 并实时地显示在程序界面的显示屏上 程序结构设置一个按钮 初始化为关闭状态 当用户点击按钮时 变为启动状态 数据采集线程启动 数据采集线程不断获取数据发送给窗口类 窗口类在获取数据后将其显示在程序的文本框和仪表控件上 并根据数据值得大小控制报警灯的状态 直到用户再次点击按钮 数据线程终止 右图为程序界面 1 程序要求及程序结构 2 程序流程 数据采集线程启动后与主线程同时运行直到此线程结束 类和对象C 中的类实际上就是由一组描述对象属性或状态的数据项和作用在这些数据项上的操作构成的封装体 结构上与C中的结构体类似 它所包含成员变量和成员函数必须由该类的对象来调用 对象是类的实例 是具有其所属类的全部成员的一个具体的实体 例如在我们将要编写的程序中有一个很重要的类CGuideDlg 它用户对程序的控制消息都会传至CGuideDlg类的一个对象dlg 它包含了一系列成员变量和成员函数 如后面将要添加的m Switch变量和OnBtnSwitch 函数等 这些变量和函数共同处理对话框接收到的各种消息 使程序按照我们的要求运行 3 需要掌握的基本概念 头文件 源文件头文件 文件名为 h 存放的是类成员的声明部分 如果要调用一个类的对象 必须先包含这个类的头文件 源文件 文件名为 cpp 存放的是成员函数的实现部分 MFCVC 6 0的MFC类库提供了大量的函数供程序员使用 我们的程序将基于MFC来完成 这样可以省掉很多麻烦的建立窗口以及消息循环的步骤 3 需要掌握的基本概念 消息 消息映射 消息响应函数WINDOWS有一个消息系统 消息系统能接受到所有的消息 并能把消息发给任何应用程序 应用程序一旦接收到消息 当然应用程序之间也能互相发送消息 如果要对这个消息处理的话 就会用到消息响应函数完成所需的处理 消息和消息响应函数之间的对应关系就构成了消息映射 对于用户自定义消息 消息映射是需要程序自己完成的 比如 WM INITDIALOG消息在程序窗口初始化的时候发出 此时程序员如果需要添加自己初始化操作 就需要截获WM INITDIALOG消息在消息响应函数OnInitDialog 函数中添加代码 有些消息 在VC编程的时候 所产生的程序框架就已经能对它进行处理了 例如 即使程序员没有在OnInitDialog 函数中添加代码 MFC也会自动生成一段代码作默认的WM INITDIALOG消息响应 3 需要掌握的基本概念 打开VC 6 0 点击菜单栏File New 弹出下图所示对话框 在Project选项卡上选择MFCAppWizard EXE Projectname栏内填入工程名 例如Guide 4 准备工作 对于功能单一 界面简单的程序 选用对话框模式 在上图所示的对话框中选择Dialogbased对话框程序 点击Finish 在下一步中点击OK 4 准备工作 在下图所示界面中删除TODO 文本框 双击 确定 按钮 生成消息响应函数OnOK 界面 工作区自动跳转至OnOK 函数的实现部分 用两斜杠将代码这段代码注释掉 CDialog OnOK 这里是为了消除回车键的默认关闭消息响应 如有必要可对其重新定义 本程序中不需 确定 按钮 可将该按钮删除 删除 工具栏 5 对话框基本功能 程序退出时弹出确认消息 双击 取消 按钮 生成消息响应函数OnCancel intreval MessageBox Quit Areyousure QUIT MB YESNO 弹出对话框 请求确认消息if IDNO reval return 若用户选择NO 该函数返回 即刚才点击的退出无效 否则将该函数将继续执行CDialog OnCancel 作默认退出处理 关闭窗口退出程序 5 对话框基本功能 将程序将用到的图片复制到工作目录下的res目录下点击Workspace栏的Resource选项卡 右键点击Guideresource 在弹出菜单里选中Import 将跳出的导入对话框中文件类型改为所有文件 选中所需图片导入 新建的IDB BITMAP1资源就是所导入的图片 可以在右键菜单中点击Properties 修改其ID号 类视图选项卡 资源视图选项卡 文件视图选项卡 6 导入资源 通过上面的方法可以将程序中将用到的图片Alert0 bmp Alert1 bmp exit bmp show bmp off bmp on bmp导入到工程中 选中各资源点击右键菜单中的Properties可进入属性设置 将以上各位图的ID分别改为IDB ALERT0 IDB ALERT1 IDB SHOWIDB EXIT IDB BMP OFF和IDB BMP ON对话框中所使用到的所有资源都是由这些ID来代示的 程序中将用到一个叫Meter的仪表控件 故需将它的相关文件Meter h Meter cpp MemDC h复制到工程目录 双击打开 分别在每个文件里点击右键菜单里的InsertFileIntoProject到Guide 6 导入资源 点击Workspace栏底部的ClassView选项卡察看类视图点击展开类可以看到这个类所包含的成员变量和成员函数 这个类相当于程序窗口的视类 本程序的主要功能将在这个类中实现 双击成员函数名 可以打开类的源文件 修改成员函数的实现部分 双击类名 比如CGuideDlg 本身或成员变量名 则可以打开它的头文件 进入头文件GuideDlg h 在顶部添加这行代码 include Meter h 将Meter类的头文件包含进来 这样CGuideDlg类就可以使用Meter控件了 7 界面设计 在资源选项卡里点击Dialog目录下的IDD GUIDE DIALOG 回到程序界面设计状态 在工具栏中点选picture工具在对话窗上拉出一块区域作仪表控件 将其ID改为IDC METER 点击工具栏的Button项 再拉出2个等大的按钮 分别作为数据采集的开关和报警灯 为了美观可以将 取消 按钮也拖到和这两个按钮一样大 由于我们将重绘这三个按钮的外观 需在按钮的属性设置的Styles选项卡上勾选OwnerDraw属性 而General选项卡上的Caption都可以去掉 把开关按钮 报警灯按钮的ID分别改为IDC BTN SWITCH IDC BTN ALERT 由于报警灯仅起只是作用 无需响应按钮消息 可以勾选它的Disabled属性 这里要使用带位图的按钮 用到CBitmapButton类 在CGuideDlg类中声明3个CBitmapButton变量 在GuideDlg h中找到下图所示部分 7 界面设计 添加以下4行代码CMeterm Meter CBitmapButtonm Alert CBitmapButtonm Exit CBitmapButtonm Switch m Meter代表仪表控件 添加下面的代码DDX Control pDX IDC METER m Meter DDX Control pDX IDC BTN ALERT m Alert DDX Control pDX IDCANCEL m Exit DDX Control pDX IDC BTN SWITCH m Switch 7 界面设计 这样m Meter m Alert m Exit m Switch就分别代表了仪表控件 报警灯 退出按钮 开关按钮 对话框创建时要对以上控件初始化 在OnInitDialog 函数的 TODO Addextrainitializationhere后添加如下代码 m Meter UpdateNeedle 0L m Meter RedrawWindow CStringstr mV m Meter SetNeedleColor RGB 255 255 235 m Meter SetColorTick TRUE m Meter SetRange 0 4000 m Meter SetUnits str m Meter SetTicks 5 m Meter SetSubTicks 10 m Meter UpdateNeedle atof 0 7 界面设计 m Alert LoadBitmaps IDB ALERT0 m Alert SizeToContent m Exit LoadBitmaps IDB EXIT 退出 按钮上显示IDB EXIT位图 m Switch LoadBitmaps IDB BMP OFF 初始状态下 开关按钮上显示IDB BMP OFF 关 报警灯处于何种状态应当设置一个变量来指示 右键点击CGuideDlg类 在弹出菜单中点击AddMemberVariable 添加BOOL型变量m bAlert 设为私有变量 值为否时处于正常状态 显示IDB ALERT0 为真时处于报警状态 显示IDB ALERT1 初始化时报警灯处于正常状态 OnInitDialog 函数需再加一行m bAlert FALSE 7 界面设计 数据显示文本框有两部分构成 纯文本框和外框图片 回到界面设计窗口 用picture工具拖出一块区域作外框图片 在属性设置中把Type改为Bitmap 在Image一栏选择IDB SHOW图片另外用EditBox工具拖出一块文本框 大小比IDB SHOW图片中的黑色区域稍小 ID设为IDC EDT DATA 勾选属性设置Styles选项卡中的Number和Read Only属性下面设定文本框的字体 在OnInitDialog 函数中继续添加以下代码CFontfont font CreateFont 20 0 0 0 400 FALSE FALSE 0 ANSI CHARSET OUT DEFAULT PRECIS CLIP DEFAULT PRECIS DEFAULT QUALITY DEFAULT PITCH FF SWISS 宋体 关注该函数的的第一个参数 它代表字符高度 即决定了字符大小 可根据文本框大小自行决定 只要保证字符基本占满文本框的高度即可 7 界面设计 显示采样值的文本框 启用刚刚创建的字体GetDlgItem IDC EDT DATA SetFont 以上代码将IDC EDT DATA即文本框控件的字体颜色设为黄色 背景为黑色 7 界面设计 显示采样值的文本框 和报警灯一样 开关按钮也应受控于一个标志变量Reading 值为真代表 开 值为假代表 关 在CGuideDlg cpp顶部的一排斜杠 的上方声明全局变量boolReading FALSE 初始状态为 关 双击IDC BTN SWITCH按钮 生成消息响应函数OnBtnSwitch 当开关按钮按下时数据采集状态将翻转 故需在OnBtnSwitch 里添加代码Reading Reading 根据Reading的状态改变开关按钮所显示的位图并刷新按钮 if Reading m Switch LoadBitmaps IDB BMP ON elsem Switch LoadBitmaps IDB BMP OFF GetDlgItem IDC BTN SWITCH Invalidate 由于在接收数据的时候 程序还需要响应其他消息 譬如按钮再次按下时接收停止 所以要新创建一个线程 7 界面设计 开关按钮 数据采集线程在运行的时候要将采集的数据送回窗口类显示 所以要将窗口句柄发送给线程函数 而CGuideDlg类中有一个成员变量m hWnd就是我们所需的窗口句柄 用强制类型转换将其转为空指针类型 放在CreateThread函数的第四个参数位置传给线程函数 在OnBtnSwitch 函数if Reading 的大括号内增加下面的代码HANDLEhThread CreateThread NULL 0 CollectProc LPVOID 关闭线程句柄CreateThread函数的第三个参数CollectProc为线程函数名 下面我们来处理CollectProc函数 7 界面设计 开关按钮 在对全局变量Reading的定义后面编写线程函数DWORDWINAPICollectProc LPVOIDlpParameter CollectProc 函数首先由传入的参数lpParameter获取窗口句柄HWNDhwnd HWND lpParameter 再对各参量进行初始化 intnPort 0 x310 intnChannel 1 shortm nLowValue m nHighValue m nResult 只要处于数据采集状态 就要不断从端口接收数据 代码如下shortm nLowValue m nHighValue m nResult outp nPort nChannel for inti 0 i DELAY i while TRUE Reading m nLowValue inp nPort 获取低位数据m nHighValue inp nPort 1 获取高位数据m nResult m nHighValue 256 m nLowValue PostMessage hwnd WM RECVDATA 0 m nResult Sleep 100 100毫秒采样一次 return1 8 数据采集线程 For语句作用仅为延时 等待硬件端口开始输出数据 要在CGuideDlg cpp顶部CAboutDlg类的声明前添加代码 defineDELAY3000 即作3000个空循环 注意PostMessage 函数 采样线程每接收到一个数据就向窗口发送消息WM RECVDATA并附带了采样值供窗口类处理显示 这里先说明一下用户消息的使用 首先定义消息名 CGuideDlg h顶部如图所示的位置添加代码定义一个宏代表这个消息 defineWM RECVDATAWM USER 1WM USER是一个自定义宏 它之后的数值可由用户自行定义为消息代号 下面我们要定义一个消息响应函数OnRecvData 当窗口类收到WM RECVDATA消息后就将执行这个函数 8 数据采集线程 用户添加的函数声明 MFC已经定义的消息响应函数 一定要注意这里 是CGuideDlg不是CAboutDlg 用户添加的消息映射 8 数据采集线程 afx msgvoidOnRecvData WPARAMwParam LPARAMlParam ON MESSAGE WM RECVDATA OnRecvData 本程序的消息响应就是将获取的数据显示在屏幕上 在类视图中找到CGuideDlg类的成员函数OnRecvData 首先从消息附带参数中获取采样数据 然后同时用仪表控件和文本框控件来输出采样值 CStringsTemp floatdata data float lParam 浮点型采样值sTemp Format 1f data 字符型采样值m Meter UpdateNeedle atof sTemp 让仪表指针指导相应位置SetDlgItemText IDC EDT DATA sTemp 将采样值显示在文本框内采样数据也将控制指示灯的状态 先定义一个宏代表警戒线 在CGuideDlg cpp顶部添加代码 defineALERTLINE2000如果原来处于熄灭状态而采样值超过了警戒线 指示灯所显示的图片变为IDB ALERT1 点亮 反之由在点亮状态下采样值低于了警戒线 则回到熄灭状态 以上两种处理后都要刷新按钮区域 在OnRecvData 函数中继续添加代码 9 主线程消息响应函数 if data ALERTLINE 到这里 就完成了主线程对WM RECVDATA消息的响应 9 主线程消息响应函数 我们用到的IO函数是 outp 和 inp 它们都被包含在头文件 conio h 中 所以要在使用到这两个函数的GuideDlg cpp和Guide cpp两文件的顶部包含此头文件 include conio h 到这里我们的程序功能就都完成了 可以在低于WIN98的系统下运行 但WIN2000之后的操作系统都对IO端口操作进行了保护 为了让程序在WIN2000以后的系统下运行 需要包含几个类库文件 将以下文件复制到工程目录 WinIo dll WinIo h WinIo lib WINIO VXD WinIo sys 在GuideDlg cpp和Guide cpp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中老年养生健康知识讲座
- 工业互联网平台自然语言处理技术在供应链管理中的应用报告
- 招生咨询培训课程
- 精神卫生护理基本技能
- 餐饮百万店长培训课件
- 幼儿园家长保健知识培训
- 内部控制财务培训
- 肩颈项目培训课件
- 机器视觉新手培训课件
- 消化内科护理服务规范与实施策略
- 妊娠期用药安全课件
- 体育场馆消防控制室操作规范
- 《中国政法大学》课件
- 国开学习网《大数据技术概论》形考任务1-4答案
- 英语研究报告范文
- 右膝关节置换术护理个案
- 高中数学教师资格考试学科知识与教学能力试题及答案指导(2024年)
- 非甾体抗炎药围术期镇痛专家共识(2024 版)解读
- 肺动脉高压诊断与治疗
- 《系统的闭环控制》课件
- 24秋国家开放大学《科学与技术》终结性考核大作业参考答案
评论
0/150
提交评论