3.2 上位机编程
上位机采用VC++6.0实现可视化界面及与下位机的通信功能。VC++是基于Windows操作系统的编程语言工具,可采用API函数来直接实现与下位机的通信,但是这种方法要涉及到很多低层设置,所以,本文采用的是Microsoft推出的ActiveX技术来实现串口通信,即应用程序直接使用ActiveX控件提供的接口来访问ActiveX控件。Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的可在简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体来说,它提供了两种处理通信问题的方法:一是事件驱动(Event2driven)方法,二是查询方法。本设计采用的是查询方法,这种方法适合于较小的应用程序。在这种情况下,每当应用程序执行完某一串行口操作后,将不断检查MSComm控件的CommEvent属性,以便检查执行结果或者检查某一事件是否发生。如果应用程序较小而且是自成一体,这种方法可能更可取。故对本设计更为可取。MSComm控件有许多重要的属性,其中首要的几个如表1所列。
在对上位机编程时,应首先创建一个基于对话框的应用程序,然后插入MSComm控件,可在对话框资源上放一个编辑框(IDC_EDIT_RECEIVE)显示电压值,再放两个按钮控件[开始测量IDC_TEST)和停止测量(ID_STOP)。然后再做对话框模板,鼠标点击右键,选择Classwizard,增加成员变量,将IDC_MSCOMMl关联成员变量m_mscomm设定为CMSComm控件类型,但IDC_EDIT_RECEIVE关联成员变量m_receive不是控件类型,是数值类型(float)。之后分别对两个按钮和MSComm控件添加消息响应函数,这可在Classwizard下自动添加。
添加代码时,要首先设置MSComm控件的属性,这可以在OnInitDialog函数中添加。本文采用的是COMl口,波特率为9600,无奇偶校验位,8位数据位,l位停止位,用二进制方式收发数据。在开始测量按钮的OnTest()函数下添加SetTimer(1,500,NULL);开启定时器每500 ms触发一次定时器事件,并在停止测量按钮OnStop ()函数下添加KillTimer(1);按钮的作用是停止定时器事件。接着是添加WM_TIMER消息。可在OnTimer(UINT nIDEvent)上添加CByteArray bytoutArr;bytoutArr.Add(0xfd);m_mscomm.SetOutput(COleVariant(bytoutArr));(采用二进制方式发送数据0xfd,500ms发送一次,下位机只有在接收到0xfd后才会将转化的数据传回来,这也相当于一个简单的通信协议。
数据的接收处理(也是本文的重点)可通过在MSComm控件的消息响应函数中采用查询方式检查接收事件是否发生来完成。具体代码如下: