老古开发网首页
导航:老古开发网首页文章索引文章分类嵌入式系统→[在VC++中用ActiveX控件实现与单片机的串行通信]
| -文章搜索 - 最新文章 - |

在VC++中用ActiveX控件实现与单片机的串行通信

发布时间:2006年2月25日 点击次数:694
来源:单片机与嵌入式系统应用   作者:石油大学 李志刚 王以法
 
在VC++中用ActiveX控件实现与单片机的串行通信 石油大学李志刚王以法 摘要详细论述在VC++60中使用ActiveX控件通过串口与单片机进行二进制数据传输的具体方法。 关键字VC++ActiveX串行通信 在单片机应用系统中,经常需要通过RS\ 232串行口与微机进行通信。目前在各种操作系统中,Microsoft的Windows较为常见,而且大多为Windows95/98等32位平台。以往在Windows平台上的串行通信多使用其提供的API函数来实现,这种方法使用起来需要许多底层设置,因而较为繁琐,并且难以理解。Microsoft推出的ActiveX技术提供了另外一种实现串行通信的方法。这种方法不仅相对较为简单,而且非常实用。尤其是在VisualC++这种可视化面向对象的编程环境中,可以真正把串口看作一个对象,编程时只需简单的设置,理解起来也很容易。下面详细讨论Microsoft提供的串行通信ActiveX控件的使用方法。该控件的相应文件是MSCOMM32.OCX,以下简称为MSCOMM控件。 一、 MSCOMM控件 MSCOMM控件,即Microsoft Communication Control,是Microsoft为简化Windows下串行通信编程而提供的ActiveX控件。它提供了一系列标准通信命令的使用接口,利用它可以建立与串口的连接,并可以通过串口连接到其他通信设备(如调制解调器),发出命令,交换数据以及监视和响应串行连接中发生的事件和错误。MSCOMM控件可用于创建电话拨号程序、串口通信程序和功能完备的终端程序。 MSCOMM控件提供了两种处理通信的方式: (1) 事件驱动方式。当通信事件发生时,MSCOMM控件会触发OnComm事件,调用者可以捕获该事件,通过检查其CommEvent属性便可确认发生的是哪种事件或错误,从而进行相应的处理。这种方法的优点是响应及时、可靠性高。 (2) 查询方式。在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。如果应用程序较小,这种方法可能更可取。例如,如果写一个简单的电话拨号程序,则没有必要每接收1个字符都产生事件,因为惟一等待接收的字符是调制解调器的“确定”响应。 在使用MSCOMM控件时,1个MSCOMM控件只能同时对应1个串口。如果应用程序需要访问和控制多个串口,那么必须使用多个MSCOMM控件。 在VC++中,MSCOMM控件只对应着1个C++类——CMSComm。由于MSCOMM控件本身没有提供方法,所以CMSComm类除了Create( )成员函数外,其他的函数都是Get/Set函数对,用来获取或设置控件的属性。MSCOMM控件也只有1个OnComm事件,用来向调用者通知有通信事件发生。 MSCOMM控件有许多很重要的属性,限于篇幅只给出几个较为重要和常用的属性,如表1所列。 表1MSCOMM控件的重要属性 属性〖〗说明CommPort〖〗通信端口号Settings〖〗以字符串形式表示的波特率、奇偶校验、数据位、停止位PortOpen〖〗通信端口的状态,打开或是关闭Input〖〗接收数据Output〖〗发送数据InputMode〖〗接收数据的类型:0为文本;1为二进制二、 编程实现 从表1可以看到,MSCOMM可以两种不同的形式接收数据,即以文本形式和以二进制形式。用MSCOMM控件进行字符数据传输的文献和资料可以找到很多,在Microsoft的MSDN(Microsoft Developer Network)中就可以找到这样的例子,即VCTERM。可是几乎所有以单片机为核心的测量系统所得到的原始数据都是二进制形式的,所以,以二进制形式传输数据将是最为直接而又简洁的办法。不仅如此,由于MSCOMM控件在文本形式下,其传输的是宽字符格式的字符,要想得到有用信息,还要额外处理。因此本文主要讨论在二进制形式下的使用方法。 在VC++60中,用APPWizard可以生成三种应用程序:单文档(SDI)、多文档(MDI)和基于对话框的应用程序。为了说明问题和省去不必要的细节,下面以基于对话框的应用程序为例。 1. 创建一个基于对话框的应用程序 打开VC++6.0集成开发环境,选择菜单项File/New,在出现的对话框中选中Projects标签中的MFC AppWizard(exe),然后在Project Name框中填入MyCOMM(可根据需要命名),之后点OK按钮。在接着出现的对话框中选中Dialog Based项,然后点NEXT按钮。以下的各对话框都按照缺省设置,这样即可生成一个基于对话框的应用程序。在资源编辑器中会出现其对话框模板。 2. 插入MSCOMM控件 选择菜单项Project/Add to project/Components and Controls…,在弹出的对话框中选择Re\ gistered ActiveX Controls文件夹下的Microsoft Communications Control,version6.0,然后按下Insert按钮,接着会弹出一个对话框,提示生成的类名及文件名,按OK按钮即可实现控件的插入。这时在对话框的控件工具栏上会多出一个电话机模样的控件图标,Workspace的Classview中也多了一个类CMSComm。 此时即可将MSCOMM控件加入到对话框模板中,加入方法与其他控件一样。然后还要在对话框类中相应加入一个成员变量,此处我们将其命名为m_comm。加入方法为:首先,在对话框模板中,用鼠标右键点击该控件,选择ClassWizard,在出现的对话框的Member Variables标签的Control Ids项下,选中IDC_MSCOMM1。然后,按Add Variable…按钮,在出现的对话框的Member Variable Name项中输入m_comm。最后,按OK按钮即可。 3. 设置属性 可以在两个地方对控件的属性进行设置: (1) 对话框资源编辑器中。在对话框模板上,用右键单击MSCOMM控件,然后选择Properties…菜单项,最后便可设置各项属性。此处只对以下几处进行改动,其他接受缺省设置:Rthershold:1,InputLen:1,DTREnable:不选,InputMode:1\ Binary。 (2) 对话框类的OnInitDialog()函数中。下面是以上设置的函数实现: BOOL CMyCOMMDlg::OnInitDialog() { CDialog::OnInitDialog(); //此处为应用框架自动生成代码,不予列出 //TODO:Add extra initialization here m_comm.SetCommPort(1);//使用串口1 m_comm.SetSettings("9600,N,8,1"); //波特率为9600,无奇偶校验,8位数据位,1位停 //止位 m_comm.SetRThreshold(10);//每接收10个字符就触发1次接收事件 m_comm.SetSThreshold(0);//不触发发送事件 m_comm.SetInputLen(10);//每次读操作从缓冲区中取10个字符 m_comm.SetInputMode(1);//二进制数据传输形式 m_comm.SetPortOpen(TRUE);//打开串口 return TRUE;// return TRUE unless you set the focus to a control } 4. 发送二进制数据 如果需要发送二进制数据,可将数据作如下处理。具体代码如下: CByteArray bytOutArr; bytOutArr.Add(0x0);//给数组赋值 bytOutArr.Add(0x1); bytOutArr.Add(0x2); bytOutArr.Add(0x3); bytOutArr.Add(0x4); COleVariant varOut; varOut=COleVariant(bytOutArr);//将数据转换为变体数据类型 m_comm.SetOutput(varOut);//发送数据 5. 接收二进制数据 当需要接收大量数据时,最好采用事件驱动方式进行编程。具体步骤如下: (1) 响应OnComm事件。在对话框资源编辑器中,双击对话框模板上的MSCOMM控件,在弹出的对话框中填入您所希望的事件响应函数名,此处将其命名为OnCommMscomm1()。 (2) 在事件响应函数中接收和处理数据。接收来的数据为变体数据,所以需要做一些处理,具体代码如下: void CMyCOMMDlg::OnCommMscomm1() { COleVariant varRcv; CByteArray byt; int i; long num; switch(m_comm.GetCommEvent()) { case 1://数据发送事件 break; case 2://数据接收事件 varRcv=m_comm.GetInput(); varRcv.ChangeType(VT_ARRAY VT_UI1); BYTE HUGEP *pbstr; HRESULT hr; hr=SafeArrayAccessData(varRcv.parray,(void HUGEP* FAR*)&pbstr);//获取安全数组指针 if(FAILED(hr)){ AfxMessageBox(“获取数组指针失败!”); break;} num=0; hr=SafeArrayGetUBound(varRcv.parray,1,&num);//获取数组上界 if(FAILED(hr)){ AfxMessageBox(“获取数组上界失败!”); break;} for(i=0;i<=num;i++) byt.Add(pbstr\[i\]); SafeArrayUnaccessData(varRcv.parray); //此时数据已保存在二进制数组byt中,可根据需要进行相关处理 break; default: break; } } 以上代码中的处理部分可以做成一个单独的函数,在此处调用即可。经过以上代码的处理,接收来的数据已存放在二进制数组byt中,可以根据自己的需要对其进行相关处理,如保存和显示等。 三、 硬件接口 单片机与微机之间的硬件接口可以用1片MAX232或ICL232与几个电容即可实现,有许多文献讨论过,此处不再赘述。 以上方法经过笔者在实践中的应用,感到非常简洁、方便,具有很强的实用意义。MES 参考文献 1Microsoft Develeper Network 2Kruglinski J David.Visual C++技术内幕.潘爱民,王国印译.北京:清华大学出版社

欢迎进入老古论坛进行讨论
[嵌入式系统] 相关文章:
ispPAC10在系统可编程模拟电路及其应用
简介:
基于VRTX操作系统实现V5接口协议 电力自动化研究院赵高峰 摘要V5接口是接入网(AN)和本地交换机(LE)之间标准化的开放接口。本文首先简要介绍V5接口协议结构,然后给出IDS2000综合数字通信系统中V5接口的实现方法;着重介绍第三层协议的软件实现方法,并对嵌入式系统编程进行一些探讨。 关键词接入网V5接口实时操作系统本地交换机 引言 接入网的概念是由传统的用户线发展起来的。近年来,由于电话业务的发展、新业务种类的增多、对线路带宽要求的提高以及各种新兴技术(特别是光纤通信技术)的发展,使得传统的用户线的概念逐渐发展成为接入网的概念。前几年,国际电信联盟(ITU)正式定义了用户接入网。引......

液晶显示模块KS0713及其应用
基于Visual C++6.0的PC机与DSPs的串行通信
基于MC68HC11单片机实现垂直奇偶校验
数字信号处理器与图形液晶显示模块的接口
VxWorks在高速数字电台互联网中的应用
闪速存储器技术现状及发展趋势
光电隔离的RS-232C串行接口设计
闪存Am29F400B的操作过程及动态数据保存
基于MSP430F1121的虚拟示波器实现方法
 
下一个:[嵌入式系统]基于分级通信模式的住宅小区自动电能计费系统的研制
简介:
基于分级通信模式的住宅小区自动电能计费系统的研制 彭城大学高玉芹 徐州发电厂张允超 摘要介绍采用多级分级通信模式组成的住宅小区自动电能计费系统的硬件构成和软件设计;重点介绍电能数据采集器的硬件组成和提高电量计量精度的方法。 关键词电能计费系统分级通信通信中继器电能数据采集器 长期以来,供电管理部门对用户电量的统计一直是在人工抄表的基础上进行的,工作量大,直接影响供电部门的工作效率。随着计算机技术和网络技术的发展,自动电能计费系统应运而生。小区内的住户数量较多,甚至成千上万,因此数据采集单元数目较多,它们与计算机之间的通信必须采用多级分级通信模式。本文介绍基于分级通信模式的住宅小区自动电能计费......
 

上一个:[嵌入式系统]P87LPC764单片机的I²C总线显示电路

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:10分钟 执行时间:16毫秒