基于zigbee的心电监护系统结题报告_第1页
基于zigbee的心电监护系统结题报告_第2页
基于zigbee的心电监护系统结题报告_第3页
基于zigbee的心电监护系统结题报告_第4页
基于zigbee的心电监护系统结题报告_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、I四川理工学院大学生创新基金项目结题报告书 基于zigbee的无线心电监护系统学 生:刘鹏飞学 号:09021070108专 业:生物医学工程班 级:医工2009.1指导教师:文宇桥 四川理工学院自动化与电子信息系二O一二年五月摘 要本系统采用zigbee技术在病人与医院之间建立了实时的心电监护系统,医生可以远程监护病人的心电状态,节省了医院的人力物力。系统通过在病人端实时采集数据进行多级滤波,通过zigbee发送端采用51内核进行AD转换,再将数据传送到zigbee接收端,再发送到串口,计算机端VC程序通过高速采集串口数据,对波形进行不失真的还原处理显示保存,实现实时监控,系统具有全天候实时

2、监控的能力以及数据存储重绘的功能。关键字:心电;zigbee;多级滤波;VC;实时监控 目 录摘 要I第 1 章 引 言- 1 -1.1 心电- 1 -1.2 心电图- 1 -第2章 系统框图设计及主要技术难点- 3 -2.1 系统框图简述- 3 -2.2 主要技术难点- 3 -2.2.1 心电采集模块- 3 -2.2.2 无线传输模块- 3 -2.2.3 计算机动态波形显示模块- 4 -第 3 章 心电采集模块- 5 -3.1 心电特征及其采集要求- 5 -3.2 前置放大处理电路- 7 -3.2.1 前置放大电路- 7 -3.2.2 滤波及陷波电路- 8 -3.2.3 主放大电路和电平提升

3、电路- 10 -3.2.4 电源供应电路- 11 -3.3 前置放大电路调试- 11 -第4章 基于ZigBee技术的心电终端设计- 13 -4.1 Zigbee网络框架- 13 -4.1.1 IEEE802.15.4物理层(PHY)- 14 -4.1.2 IEEE802.15.4MAC层- 14 -4.1.3网络层(NWK)- 15 -4.1.4 应用层(APL)- 15 -4.2 心电终端- 16 -4.3 CC2430无线收发模块- 16 -4.4 ZigBee网络软件设计- 17 -4.4.1 网络形成- 18 -4.4.2 数据发送- 18 -4.4.3 数据接收- 19 -4.5软

4、件开发及调试环境- 20 -第 5 章 实时波形显示- 21 -5.1 编程语言简介- 21 -5.2串口操作- 22 -5.2.1 串口操作方法选择- 22 -5.2.2 程序关键源代码- 22 -5.3 实时绘图操作- 27 -5.3.1 绘图原理- 27 -5.3.2 程序关键源代码- 27 -5.4 数据的保存与重绘- 35 -5.4.1 数据的保存- 35 -5.4.2数据的重绘- 36 -5.5 调试效果- 37 -参考文献- 39 -附 录- 40 - 42 -第 1 章 引 言1.1 心电心脏周围的组织和体液都能导电,因此可将人体看成为一个具有长、宽、厚三度空间的容积导体。心脏

5、好比电源,无数心肌细胞动作电位变化的总和可以传导并反映到体表。在体表很多点之间存在着电位差,也有很多点彼此之间无电位差是等电的。心脏在每个心动周期中,由起搏点、心房、心室相继兴奋,伴随着生物电的变化,这些生物电的变化称为心电。1.2 心电图心电图指的是通过心电描记器从体表引出多种形式的心电电位变化的图形(简称ECG)。心电图是心脏兴奋的发生、传播及恢复过程的客观指标。在一个正常心动周期中,一个典型的ECG波形是由一个P波,一个QRS波群,一个T波。心电图的基线被称为等电势线。一般情况下,等电势线在心电图中是指T波后和P波前的那一段波形。 其波形图如图1-1所示:图1-1正常人体心电图图解名称描

6、述时长RR间期相邻两个R波相隔的时间可以反应心率。静息状态下心率在50bpm到100bpm之间。0.61.2sP波在正常的心房除极过程中,心电向量从窦房结指向房室结。除极由右心房至左心房。这个过程在心电图上形成了P波。80msPR intervalPR间期指从P波开始到QRS波群开始的时间。PR间期反映了电冲动由窦房结发出,经房室结传入心室引起心室除极所需的时间。所以,PR间期可以很好的评估房室结的功能。120200msPR 段PR段连接了P波和QRS波群,代表了心电冲动由房室结传到希氏束、左右束支及浦金氏纤维的过程。这个过程中心电冲动并不直接引起心肌收缩,而只是其向心室传导的一个过程,所以在

7、心电图上显示一个平直段。PR段对于临床诊断非常重要。50120msQRS波群QRS波群反映了左右心室的快速去极化过程。由于左右心室的肌肉组织比心房发达,所以QRS波群比P波的振幅高出很多。80120msJ点J点是QRS波群结束和ST段的开始的位置。J点用于ST段抬高或者压低的参照点。N/AST段ST段连接QRS波群与T波,代表心室缓慢复极化的过程。它位于等电势线上。80120msT波T波代表心室快速复极化过程,从QRS波群起始处到T波最高点这段时间称为心脏的绝对不应期,而T波的后半段则称为相对不应期(又称易激期)。.160msST间期J点到T波开始时的时间320msQT间期QT间期是QRS波群

8、开始到T波结束时的时间。QT间期过长是室性心动过速的危险因子之一,可能引起猝死。QT间期受心率变化较大,所以采用QTc来消除心率影响。300430ms,Qtc:440msU波并不能经常看到,振幅很低,跟随T波后出现。产生机制不清楚。表1-1 心电波形与间期特征表第2章 系统框图设计及主要技术难点2.1 系统框图简述本系统主要由三部分构成,它们分别是心电采集模块,zigbee无线传输模块,计算机动态波形显示模块。其中,心电采集模块使用三导联进行心电数据的采集、然后进行滤波、放大等处理,zigbee数据发送端将信号进行AD处理,然后通过无线发送到zigbee接收端,在接收端通过串口与计算机相连,计

9、算机通过采集串口的数据进行处理,然后进行实时的显示波形并保存数据。心电采集模块Zigbee无线传输模块计算机动态波形显示模块图2-1 系统框图梗概2.2 主要技术难点2.2.1 心电采集模块在心电采集时由于人体体表存在极其复杂且严重的外界干扰,因此设计一个高效的滤波电路非常重要,这将影响到后期的所有处理。2.2.2 无线传输模块由于在无线传输中存在不可预期的外界干扰,很容易引起信号失真,同时要保证传输数据的准确以便在计算机上完整还原波形,信号的分辨率要高,另外要保证较远的的传输距离必须要有足够的发射功率。2.2.3 计算机动态波形显示模块在上位机上首先要对串口数据进行采集处理,然后进行波形绘制

10、。怎样保证串口接收的数据的实时准确,如何动态的绘制实时波形这是一个难点,同时要防止绘图时屏幕的闪烁。第 3 章 心电采集模块3.1 心电特征及其采集要求生物医学信号都具有信号强度较弱、背景噪声较强、频率范围一般较低,随机性强等特点。当前生物医学信号处理已经是一个重要的研究领域,也是近年来迅速发展的数字信号处理技术的一个重要的应用方面。一个心电图(ECG)是用来记录由心脏产生的人体表面的电信号变化,ECG测量信号从安放在人体特定位置的皮肤电极采集而来。ECG信号由6个大写字母P,Q,R,S,T,U标记的波峰和波谷来表示,如图3-1所示。 图3-1 ECG信号的形式ECG信号的前段是由非常微弱的信

11、号构成的,从0.5mV到5mV,其中还包括由于心电电极与人体皮肤连接产生的300mV左右的极化电压。一个标准的ECG信号的带宽为0.05Hz到100Hz,根据本系统设计的需要(远程心电监护),ECG的有效频率带宽可视为为0.05Hz到50Hz。ECG信号可能受各种噪声的干扰。主要的噪声为: 50Hz的电力线干扰及其谐波干扰,即工频干扰,此干扰信号耦合到人体,表现为可达到几伏的共模信号,对于ECG来说,是最主要的干扰。 电极接触噪声,电极与皮肤之间的松动可能造成基线漂移。 人体移动干扰,使得电极与皮肤的阻抗变化,造成基线漂移。 从其它电子设备耦合过来的高频噪声。 心电信号总是在一定的范围内波动,

12、有时候也会随着某种疾病发生改变,不同的人,起心电图的波形有差异,这个差异有时还很大。 因此对采集电路有如下要求: 高增益,针对ECG信号微弱的情况,较高的放大倍数提高系统采集精 度。 高输入阻抗,由于信号源阻抗高,且容易变化,而心电信号很微弱。若输入阻抗不高,则经分压后的信号就更小,导致心电信号损失严重,且信号源过负荷将导致心电信号发生畸变。 高共模抑制比,以消除工频干扰及极化电压的干扰。 低噪声,使之不淹没极其微弱且信噪比低的心电信号。 低漂移,以防止高放大倍数的放大电路出现饱和现象。 合适的带宽,以便有效地抑制噪声,防止采样混。 下图展示了标准导联单通道的采样框图。图3-2 标准导联单通道

13、采样框图3.2 前置放大处理电路3.2.1 前置放大电路前置放大电路要完成功能是实现信号的差分放大,该部分电路在整个采集电路中起着至关重要的作用,高性能的前置放大电路能对干扰信号起到很好的抑制作用。针对心电信号采集的要求,本设计选用的了美国Analog Device 公司生产的仪表放大器AD620。AD620是一个低功耗,高精度仪表放大器,其内部由三运放电路构成,在1kHz是共模抑制比CMRR>>100dB,最大偏移电压为50uV,低输入偏置电流(最大1nA),低输入电压噪声(从0.1Hz到10Hz为0.28uV)。AD620仅仅只需要一个外接的增益调节电阻就可以改变放大起的增益(

14、),在这里,Gain=97.8。右腿驱动电路的引入能够进一步提高信号的采集质量,将右腿连接到一个辅助的运算放大器的输出端,通过这个负反馈结构,可大大抑制测量过程中前置放大器输入端共模电压。除了右腿驱动之外,还采取屏蔽驱动的措施来提高整个电路的抗共模干扰能力,保障患者的安全。对于直流共模信号,由于运放输入端短路,流过电阻的电流为零,共模输出电压为零。所以,测量放大器对直流共模信号的抑制比为无穷大。但对于交流共模信号,情况就不一样了,因为输入信号的传输线存在线电阻和分布电容。它们分别对地构成回路,当两条传输线对地的分压不一样时,在运放两个输入端产生差模信号,所以电阻有交流差模电流流过,从而产生交流

15、共模干扰。屏蔽驱动器实际就是一个电压跟随器,将运放的共模信号取出来加到屏蔽层,由于屏蔽层和信号线间对交流共模信号等电位,因此传输线的分压左右就不存在,从而大大降低了交流共模信号的影响。前置放大电路如图3-3。R4为,J2为右腿驱动端口,J1的1、2、3端口分别接左手电极、右手电极、屏蔽线屏蔽层。 图3-3 前置放大电路3.2.2 滤波及陷波电路滤波电路由高通滤波电路和低通滤波电路组成。滤波可采用模拟滤波器和数字滤波器。模拟滤波器具有结构简单,对硬件电路要求不高的特点,但要想做到特别好的滤波效果,必须做到高阶,这是非常困难的。数字滤波器要求使用性能较好的数字电路,但可以做到高阶,滤波效果好。本次

16、设计中Zigbee无线模块采用51内核单片机,不适合做数字滤波,对于心电监护,模拟滤波器的效果已经足够,故本设计采用模拟滤波器。OP07为一个低噪声,高精度的运算放大器,低输入偏移电压(最大为25uV)。低偏移电压消除了运放OP07对外围电路的需求。低输入偏置电流(OP07A为2nA),高开环增益(OP07为300V/mV)。低偏移和高开环增益使OP07特别适合高增益的仪表应用中。为消除直流信号以及高频噪声的影响,电路中加入0.05Hz二阶高通滤波器,和50Hz二阶低通滤波器,如下图所示。 图3-4二阶高通滤波器 图3-5二阶低通滤波器尽管前面已经设计了对共模信号的抑制,但任有一部分50Hz共

17、模干扰以差模信号的形式输出到后级电路中,故本采集电路加了50Hz陷波电路,如下图所示,本电路的原型是双T陷波电路,但要求达到精确的频率,双T电路中的电阻改为电位器,电容用涤纶电容,在调试中通过调节电位器调整陷波器的中心频率。图3-6 双T陷波电路 3.2.3 主放大电路和电平提升电路 该部分电路由单电源同相交流放大电路和电压跟随器组成。 单片机AD采样的电压范围为0到VDD,而前置放大电路由双电源供电,通过的信号为交流信号,不适合单片机采样,故需要一个电平提升电路是心电信号能被单片机采样,电路如图3-7。电源VCC通过电位器RP4分压,使运放同相输入端电位V+=Vcc/2,由于C9隔直流,使R

18、P5引入全直流负反馈,所以静态时,运放输出端电压Vo=V+=V-=Vcc/2,C9、C10通交流,使RP5引入交流负反馈,是电压并联负反馈。放大器的增益为Au=1+RP5/R18,放大器输入电阻=RP4/2=50K,输出电阻=0。图3-7 电平提升电路 电压跟随器具有高输入阻抗,低输出阻抗的特点,因此,在将心电信号送入单片机采样前,加上一个电压跟随器可以提高单片机采样端口的输入阻抗,提高前置放大电路的驱动能力,如下图所示,其中FB1为磁珠,将模拟地与数字地隔离,提高前置放大电路的抗干扰能力。图3-8 电压跟随器电路3.2.4 电源供应电路 前置放大电路由电池供电,负电压由ICL7660S产生,

19、它是电荷泵方式的电压反转器,外围只需外接两只低损耗电容,无需电感,降低了损耗、面积及电磁干扰。芯片的振荡频率为10KHz,多用于LCD、仪表中。下图为典型应用电路。 图3-9 典型供电电路 由于单片机工作电压为3V,AD620工作电压为3V,ICL7660的负电压输出是随输出电流的变化而有一定变化的,故前置放大电路的电源由3.7V电池单独供电,提高了前置放大电路的可靠性和运放的输出动态范围。3.3 前置放大电路调试 画好电路图和PCB图后,将PCB板做出来,将元器件焊上,接通电源,测量各芯片是否工作在正常电压下,用信号发生器依次输入10Hz,20Hz,30Hz,40Hz,50Hz,60Hz信号

20、,用示波器观察输出信号是否满足增益放大、滤波陷波衰减要求。在满足设计要求的前提下,接上人体进行实际测试,通过示波器观察,得到心电图:图3-10 示波器观察结果第4章 基于ZigBee技术的心电终端设计4.1 Zigbee网络框架Zigbee的体系结构由称为层的各模块组成。每一层为其上层提供特定的服务:即由数据服务实体提供数据传输服务;管理实体提供所有的其他管理服务。每个服务实体通过相应的服务接入点(S AP )为其上层提供一个接口,每个服务接入点通过服务原语来完成所对应的功能。Zigbee协议的体系结构如下图所示:图4-1 Zigbee协议的体系结构4.1.1 IEEE802.15.4物理层(

21、PHY)物理层定义了物理无线信道和MA C子层之间的接口,提供物理层数据服务和物理层管理服务。 物理层内容: 1) Zigbee的激活;2) 当前信道的能量检测(Energy Detection,ED);3) 接收链路服务质量信息(Link quality indicator,LQI);4) Zigbee信道接入方式;5) 信道频率选择;6) 物理媒介的数据接收和发送。4.1.2 IEEE802.15.4MAC层MAC层负责处理所有的物理无线信道访问,并产生网络信号、同步信号;支持PA N连接和分离,提供两个对等M AC实体之间可靠的链路。 MAC层功能: 1)网络协调器产生信标; 2)与信标

22、同步; 3)支持PAN (个域网)链路的建立和断开; 4)为设备的安全性提供支持; 5)信道接入方式采用免冲突载波检测多址接入(CS MA-CA )机制; 6)处理和维护保护时隙( GTS )机制; 7)在两个对等的M AC实体之间提供一个可靠的通信链路。4.1.3网络层(NWK) ZigBee协议栈的核心部分在网络层。网络层主要实现节点加入或离开网络、接收或抛弃其他节点、路由查找及传送数据等功能。 网络层功能: 1) 网络发现;2) 网络形成;3) 允许设备连接;4) 路由器初始化;5) 设备同网络连接;6) 直接将设备同网络连接;7) 断开网络连接;8) 重新复位设备;9) 接收机同步;1

23、0) 信息库维护。 4.1.4 应用层(APL) ZigBee应用层框架包括应用支持层(APS)、ZigBee设备对象(ZDO)和制造商所定义的应用对象。 应用支持层的功能包括:维持绑定表、在绑定的设备之间传送消息。 ZigBee设备对象的功能包括:定义设备在网络中的角色(如ZigBee协调器和终端设备),发起和响应绑定请求,在网络设备之间建立安全机制。ZigBee 设备对象还负责发现网络中的设备,并且决定向他们提供何种应用服务。 ZigBee应用层除了提供一些必要函数以及为网络层提供合适的服务接口外,一个重要的功能是应用者可在这层定义自己的应用对象。ZDO其实是一个APS之上的内置应用对象,

24、是对ZigBee设备基本功能的抽象,通过标识O接入到APSDE一SAP。它通过ZDO公共接口为AF框架中的应用对象提供设备级的对象管理服务,包括定义设备类型(如协调器、路由器、终端设备),发起和响应绑定请求,发现网络中的设备和其能提供何种应用服务、与其它网络设备建立安全链接等。其中设备发现只能由协调器或路由器发起,终端设备可以响应设备发现查询,并根据查询请求响应自己的设备地址或网络地址。协调器或路由器发送自己的设备地址或网络地址(附加上其关联设备的网络地址)。ZDO还提供初始化APS,网络层等功能。应用程序框架(AF):运行在ZigBee协议栈上的应用程序实际上就是厂商自定义的应用对象,并且遵

25、循规范(profile)运行在端点1240上。在ZigBee应用中,提供2种标准服务类型:键值对(KVP)或报文(MSG)4.2 心电终端心电终端节点通过zighec网络接入监护系统,其硬件平台由Zigbee模块、心电采集电路、滤波电路以及外围电路组成。心电终端设备作为整个系统的数据前端部分,是获取数据的来源。设备由心电采集电路和CC2430两个模块组成,在物理上是组合在一起的,使用时由病人携带在身上,连接好导联电极后启动设备,进行实时心电采集和传输。心电信号由电极和导联线从人体采集,经过放大和滤波处理后,再进行模数转换,并通过串口传送到CC2430完成无线发送。4.3 CC2430无线收发模

26、块CC243O的主要特性如下:CC2430 芯片延用了以往CC2420 芯片的架构,在单个芯片上整合了ZigBee 射频(RF)前端、内存和微控制器。它使用1 个8 位MCU(8051),具有128 KB 可编程闪存和8 KB的RAM,还包含模拟数字转换器(ADC)、几个定时器(Timer)、AES128 协同处理器、看门狗定时器(Watchdog timer)、32 kHz 晶振的休眠模式定时器、上电复位电路(Power On Reset)、掉电检测电路(Brown out detection),以及21 个可编程I/O 引脚。CC2430 芯片采用0.18 m CMOS 工艺生产;在接收和

27、发射模式下,电流损耗分别低于27 mA 或25 mA。CC2430 的休眠模式和转换到主动模式的超短时间的特性,特别适合那些要求电池寿命非常长的应用。 CC2430SoC的模块功能结构如下图示:图4-3 CC2430SoC的模块功能结构4.4 ZigBee网络软件设计zigBee网络平台主要为心电终端获取的心电数据提供一个安全、可靠的传输通道,为了实现zigBee网络的形成和接入,需要对系统中的设备进行类型定义。ZigBee网络中的设备分为全功能设备FFD和受限功能设备RFD,FFD可以创建网络和接收RFD加入网络,设备类型包括协调器和路由器,RFD只能加入网络并传输数据,设备类型为终端节点设

28、备。一个成型的ZigBee网络必须同时包含这两种设备。在本系统中,心电终端属于RFD,负责加入zigBee网络并传输数据,是zigBee网络的终端节点,FFD配置在网关的cc2430模块上。本系统将FFD配置为协调器节点。4.4.1 网络形成协调器将扫描DEFAULT_CHANLIST指定的通道,最后在其中之一上形成网络。如果ZDAPP_CONFIG_PAN_ID被定义为0xFFFF,那么协调器将根据自身的IEEE地址建立一个随机的PAN ID;如果ZDAPP_CONFIG_PAN_ID没有被定义为0xFFFF,那么协调器建立PANID将由ZDAPP_CONFIG_PAN_ID制指定。所有参数

29、设置好后调用ZDO_StartDevice()函数来启动一个设备。4.4.2 数据发送当传感节点与采集节点建立网络后会调用zb_BindConfirm()函数,该函数主要功能是,如果建立绑定成功,则传感节点开始向采集节点发送传感数据;否则,重新搜索采集节点。zb_BindConfirm()函数如下:void zb_BindConfirm( uint16 commandId, uint8 status ) if ( ( status = ZB_SUCCESS ) && ( myAppState = APP_START ) ) myAppState = APP_BOUND; /开始

30、向采集节点发送数据 myApp_StartReporting(); else / 如果不能建立绑定则重新搜索采集节点osal_start_timerEx(sapi_TaskID,MY_FIND_COLLECTOR_EVT,myBindRetryDelay ); 然后在zb_HandleOsalEvent()函数中调用zb_SendDataRequest()函数,再在zb_SendDataRequest()函数中调用AF_DataRequest()函数把数据发送出去。4.4.3 数据接收在采集节点中,当其接收到传感节点的信息后,将触发SYS_EVENT_MSG事件,并对AF_INCOMING_M

31、SG_CMD信息做处理,最终在zb_ReceiveDataIndication()函数中调用debug_str()函数将收集到的数据发送到串口中。zb_ReceiveDataIndication()函数如下:void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData ) uint8 buf32; uint8 *pBuf; if (command = SENSOR_REPORT_CMD_ID) / 从一个节点接收数据 pBuf=buf; if ( pData0 = ADC_REPOR

32、T ) /*pBuf+ = (uint8)0x01; *pBuf+ = pData1; *pBuf = '0'#if defined( MT_TASK ) debug_str( (uint8 *)buf );#endif 4.5软件开发及调试环境心电采集的无线传输部分采用TI公司的Zigbee协议栈(ZStack-1.4.3-1.2.1)进行二次开发,z-stack是TI公司对ZigBee协议栈的优化实现,达到了zigBee测试机构德国莱茵集团(TUVRheinland)评定的zigBee联盟参考平台(朗ldenunit)水平,目前己为全球众多zigBee开发商所广泛采用。第

33、5 章 实时波形显示5.1 编程语言简介本程序采用的是MFC编程,即微软基础类库(Microsoft Foundation Classes),它以C+类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。 Visual C+包含MFC应用程序向导,可用于兼容MFC的应用程序。在ATL程序中也可以手动添加MFC支持。在向导中有各种选项以定制生成的程序的功能,例如界面风格、语种、数据库开发支持、打印支持、自动化支持、ActiveX支持、网络支持、基于HTML的帮助文档

34、支持等等。在COM开发方面,相对于ATL来说,MFC的组件比较大,代码不够短小精悍,但是支持的功能也比较多,例如有对ActiveX Document的封装类。在界面开发方面,MFC提供对消息循环的封装,使用消息映射来避免虚函数的开销。MFC也提供常用Windows通用控件的封装类。MFC扩展DLL的接口使得MFC程序可以直接调用MFC扩展DLL中的MFC类。MFC也支持在标准DLL中被使用。MFC的主要优点是可以用面向对象的方法来调用Windows API,以及应用程序开发的便捷。MFC将很多应用程序开发中常用的功能自动化,并且提供了文档框架视图结构和活动文档这样的便于自定义的应用程序框架。同

35、时,在Visual C+内部也内建了很多对MFC的例如类向导这样的支持以减少软件开发的时间,使用类向导可以生成从hello world这样的简单程序到活动文档服务器这样的复杂程序。MFC的消息映射机制也避免了使用性能较低的庞大虚函数表。 虽然MFC的源代码对用户是完全开放的,但是MFC的一些封装过程过于复杂,以致于新用户很难迅速掌握MFC的应用程序框架,以及在调试中定位问题的位置。同时,很多MFC对象不是线程安全的,致使在跨线程访问MFC对象时需要编写额外的代码。另外,MFC的很多类依赖于应用程序向导生成的代码,使得在使用Visual C+中其他类型的应用程序向导生成的工程中添加MFC支持的难

36、度大大增加。 5.2串口操作5.2.1 串口操作方法选择针对串口的操作有很多方法,一方面可以使用windows提供的MSComm控件,一方面可以直接使用windows API函数,还有一种方法是使用一些第三方的串口类。本程序使用的是CnComm串口类进行编程。CnComm是由程序员llbird开发的C+串口通讯类,功能丰富实用。类的声明和实现都被定义在一个头文件中,使用方法简单。使用时只需要在工程中含入其头文件即可。其详细源代码可见于 5.2.2 程序关键源代码1. 关联窗口句柄:m_comm.SetWnd(this->m_hWnd);2. 设置串口选项为使用监视线程、使用异步重叠IO方

37、式、使用读缓冲:m_comm.SetOption(m_comm.GetOption() | CnComm:EN_RX_BUFFER);3. 打开串口并初始化配置串口:图5-1 Comm子菜单及其菜单项当点击Open Comm 后弹出对话框,选择一个串口作为通信接口,如下图所示:图5-2void CECGView:OnCommOpen().同时,你也可以选择Option.选项进行一些串口的设置:图5-3 DCB Settings 对话框void CECGView:OnCommDcb() / TODO: Add your command handler code hereCDcbDlg DcbDl

38、g(&m_comm, this);DcbDlg.DoModal();图5-4 超时设置对话框void CECGView:OnCommTimeouts() / TODO: Add your command handler code hereCTimeoutsDlg TimeoutsDlg(&m_comm, this);TimeoutsDlg.DoModal();4. 串口接收数据进行处理头文件中加入afx_msg LRESULT OnCommReceive(WPARAM wParam, LPARAM lParam);Cpp文件中加入ON_MESSAGE(ON_COM_RECEIV

39、E,OnCommReceive)LRESULT CECGView:OnCommReceive(WPARAM wParam, LPARAM lParam)if(wParam = m_comm.GetPort()BYTEm= 0x00;BYTE*buffer= &m;doublen= 0;doublecount= 0;inti= 0;doubley= 0;do int length = m_comm.Read(buffer, 1);if(length)/DA转换for(i = 0; i < 8; i+)if(m >> i) & 0x01)count += pow(

40、2.0, i); y = count * RESOLUTION;m_Plot.AddPoint(1,:GetTickCount(),y);/加入绘图队列中Invalidate();/引起窗口重绘count = 0;if(m_bAutoSave = TRUE)fwrite(buffer, sizeof(BYTE), 1, m_fp);/保存数据 while(m_comm.IsRxBufferMode() && m_comm.Input().SafeSize();return TRUE; 5.3 实时绘图操作5.3.1 绘图原理每当串口收到数据后,先把数据进行DA的转换,再依次添加

41、到绘图的队列中,每加入一个数据包括采集数据的时刻点(ms)和数据的值,然后引起窗口重绘把实时的数据描绘在屏幕上,然后再把该点保存到一个指定的文件中。在绘图上以Jan Vidar Berger编写的clPlot 类为基础,结合实际需要把它做了很多改进。使用动态链接库可以方便的导出其中的函数与成员变量,它派生于CWnd,故可以方便的在窗口中进行绘图操作。5.3.2 程序关键源代码当串口接收数据后,先进性DA转换,然后调用:m_Plot.AddPoint(1,:GetTickCount(),y);/加入绘图队列中把数据加入绘图队列:BOOL clPlot:AddPoint(int serie, DW

42、ORD valuetime, double value)m_seriesserie.AddPoint(valuetime, value);.调用serie类的AddPoint(),在该函数中如果数据量小于规定的最大数据量就会在堆上自动分配一个value结构体大小的内存空间,直到大于最大数据量m_dwMaxDataPrSerie,同时在该函数中采用循环指针的方式,提高内存的利用率,避免了内存的大量开销。void serie:AddPoint(DWORD &valuetime , double &y)if(m_dwNoValues < clPlot:m_dwMaxDataPr

43、Serie)if(m_dwNoValues > 0)m_pvalues = (value*)realloc(m_pvalues, (m_dwNoValues+1)*sizeof(value);elsem_pvalues = (value*)malloc(m_dwNoValues+1)*sizeof(value);m_pvaluesm_dwend.ValueTime = valuetime;m_pvaluesm_dwend.dValue = y;m_dwNoValues+;m_dwend+;if(m_dwend >= clPlot:m_dwMaxDataPrSerie)m_dwend

44、 = 0;if(m_dwbegin = m_dwend)m_dwbegin+;if(m_dwbegin >= clPlot:m_dwMaxDataPrSerie)m_dwbegin = 0;当加入数据完成后,程序返回OnCommRecive()函数中,接着执行Invalidate()函数,这将引起窗口重绘执行以下代码:void clPlot:OnPaint() CPaintDC dc(this); / device context for painting CMemDC pdc(&dc); / non flickering painting Draw(&pdc);/ Do

45、 not call CWnd:OnPaint() for painting messagesBOOL clPlot:OnEraseBkgnd(CDC* pDC) return FALSE;在执行CMemDC pdc(&dc);时会定义内存DC,里面封装了一个兼容DC,并调用BitBlt()函数实现无闪烁绘图。 调用Draw(&pdc);时会调用如下代码:void clPlot:Draw(CDC * dc) .DrawPlot(dc);.在这里面DrawPlot(dc)会调用DrawSerie(dc, s),其定义如下:void clPlot:DrawSerie(CDC *dc,

46、int s)BOOL bMore=TRUE;BOOL bDraw;CPoint p;int ly;/ lets get some serie parameters now and save the time of indexing during the loopDWORD y = m_seriess.m_dwbegin;DWORD m = m_seriess.m_dwend;DWORD a = m_seriess.m_dwNoValues;BOOL bRightAxis = m_seriess.m_bRightAxisAlign;CPen pen(m_seriess.m_iLineStyle,

47、 1, m_seriess.m_color);CPen *old = dc->SelectObject(&pen);while(bMore)bDraw=FALSE;bMore=FALSE;ly=0;while(y != m && !bDraw)if(m_seriess.m_pvaluesy.dValue = m_dNoData)/only when m_dwNoValues<=m_dwMaxDataPrSerie will enter inbDraw = TRUE;bMore = TRUE;else/Scaling. We do scaling inline

48、 to save some timeDWORD valuetime = m_seriess.m_pvaluesy.ValueTime;p.x = (int)(m_plotRect.left + (valuetime-m_timeaxis.m_mintime)/m_timeaxis.m_dMillisecondsPrPixel);if(bRightAxis)p.y = (int)(m_plotRect.bottom - (m_seriess.m_pvaluesy.dValue-m_rightaxis.minrange)/m_rightaxis.m_dValuePrPixel);elsep.y =

49、 (int)(m_plotRect.bottom - (m_seriess.m_pvaluesy.dValue-m_leftaxis.minrange)/m_leftaxis.m_dValuePrPixel);if(ly = 0 | p.x != pLineArrayly.x | p.y != pLineArrayly.y)&& (p.x >= m_plotRect.left && p.x <= m_plotRect.right)pLineArrayly.x = p.x;pLineArrayly.y = p.y;ly+;y+;/if(y > a)/ wrap list index ?if(y > (a >= clPlot:m_dwMaxDataPrSerie ? clPlot:m_dwMaxDataPrSerie : a)y=0;if(ly > 0)dc->Polyline(pLineArray, ly);dc->SelectObject(old);上述代码会依

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论