VC++用ActiveX控件与单片机串行通信

发布者:快乐行者最新更新时间:2012-06-27 来源: 慧聪电子元器件商务网 关键字:VC++  ActiveX控件  串行通信 手机看文章 扫描二维码
随时随地手机看文章

   在单片机应用系统中,经常需要通过RS-232串行口与微机进行通信。目前在各种操作系统中,Microsoft的Windows较为常见,而且大多为Windows95/98等32位平台。以往在Windows平台上的串行通信多使用其提供的API函数来实现,这种方法使用起来需要许多底层设置,因而较为繁琐,并且难以理解。Microsoft推出的ActiveX技术提供了另外一种实现串行通信的方法。这种方法不仅相对较为简单,而且非常实用。尤其是Visual C++这种可视化面向对象的编程环境中,可以真正把串口看作一个对象,编程时只需简单的设置,理解起来也很容易。下面详细讨论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所列。

   表1 MSCOMM控件的重要属性:

   属 性 说 明
   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…,在弹出的对话框中选择Registered ActiveX Controls文件夹下的Microsoft Communications Control,version6.0,然后按下Insert按钮,接着会弹出一个对话框,提示生成的类名及文件名,按OK按钮即可实现控件的插入。这时在对话框的控件工具栏 上会多出一个电话机模样的控件图标,Workspace的Classview中也多了一个类CMSComm。[page]

   此时即可将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::OnlnitDialog()
   {
   CDialog::OnlnitDialog();
   //此处为应用框架自动生成代码,不予列出
   //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())
   {
   cass 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 
   byt.Add(pbstr [i]);
   SafeArrayUnaccessData (varRcv.parray);
   //此时数据已保存在二进制数组byt中,可根据需要进行相关处理
   break;
   default:
   break;
   }
   }
   
   以上代码中的处理部分可以做成一个单独的函数,在此处调用即可。经过以上代码的处理,接收来的数据已存放在二进制数组byt中,可以根据自己的需要对其进行相关处理,如保存和显示等。
   
   三、硬件接口

   单片机与微机之间的硬件接口可以用1片MAX232或ICL232与几个电容即可实现,有许多文献讨论过,此处不再多述。

   以上方法经过笔者在实践中的应用,感到非常简洁、方便,具有很强的实用意义。

关键字:VC++  ActiveX控件  串行通信 引用地址:VC++用ActiveX控件与单片机串行通信

上一篇:用MSP430F149单片机实现步进电机通用控制器
下一篇:硬件设计鸡毛蒜皮之一: 低功耗设计

推荐阅读最新更新时间:2024-03-16 13:02

VC++的现场总线控制系统在水处理系统中的应用
1  引言         随着火力发电厂单机容量的不断增大,系统越来越复杂性,出于机组安全性和使用寿命的考虑,对水汽品质的要求越来越严。实现化学水处理设备的自动化,是当今电厂化学水处理技术发展的必然趋势,其安全性及可靠性更是至关重要。     受汉新发电有限公司的委托,本课题组对该公司原有水处理系统进行改造,开发出基于can总线的化水监控系统,将现场总线技术应用于水处理监控系统,全面提高了该系统的自动化程度,使其更有效更可靠更安全的运行。此计算机监控系统将控制功能彻底下放到现场,降低了安装成本和维修费用。上位机、下位机与现场之间达到同步控制,实现有效可靠的远距离监控及操作,节约人力资源,提高劳动效率,实现效益最大化。 2
[嵌入式]
基于TMS320VC5507的语音识别系统实现
  1 语音识别片上系统概述   随着数字信号处理技术的发展,语音识别片上系统已成为人们研究的热点。然而,复杂的系统与硬件需求的矛盾,一定程度上限制了它的应用和推广。本文针对上述问题,采用相应的识别策略[1],合理安排算法流程,完成了高性能特定人与非特定人识别系统的片上实现。   2 硬件平台   DSP选型时需综合考虑运算速度、成本、功耗、硬件资源和程序可移植性等因素。本系统采用美国德州仪器(TI)生产的TMS320VC5507定点DSP作为核心处理器[2],并配合使用PLL时钟发生器、JTEG标准测试接口、异步通信串口、DMA控制器、通用输入输出GPIO端口以及多通道缓冲串口(McBSPs)等主要片内外设。系统硬件平台如图1所
[嵌入式]
基于TMS320<font color='red'>VC</font>5507的语音识别系统实现
TMS320VC5402 HPI接口与PCI总线接口设计
  数字信号处理器DSP(Digital Signal Processor)是一种特别适合于进行数字信号处理的微处理器,凭借其运算速度快、功能强等特点,在各个领域的应用越来越广泛。但在很多场合下需要将DSP的各种外围设备同计算机连接,以实现数据传输。通常情况下可利用DSP的串口或I/O口来实现,但无论是接串口还是接I/O口都要占用DSP的硬件资源,同时数据的传输速度有时也不能满足系统的要求。为了解决这一问题,将DSP的HPI口通过PCl2040芯片桥接到PCI总线。本文以TMS320VC5402(简称VC5402)为例,介绍DSP的HPI口及其与PCl2040的接口设计。   1 HPI接口功能及特点   主机接口HPI(Hos
[嵌入式]
硅谷之斗:创始人与VC争夺公司控制权
7月11日消息,华尔街日报今天发布文章称,硅谷正上演权力争夺战,初创公司的创始人在进行融资时纷纷努力争取其公司的控制权,以更好地抵制外部干扰,专注于产品的开发。 以下为文章主要内容: 颠覆传统投资理念 硅谷正在上演权力争夺战。 作为最具影响力的风险投资公司之一,Andreessen Horowitz在过去两年间彻底颠覆了对初创公司的惯常投资理念。该公司告诉创业家它更喜欢投资创始人控股的公司,认为这样的话创始人将能够更好地抵制外部的干扰,专注于打造卓越的产品。 Andreessen Horowitz自然地获得了创业家们的支持。其旗下管理资金达27亿美元,投资的公司包括Facebook、Zynga和Groupon。Andre
[半导体设计/制造]
STM32常见的串行通信接口
通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。并行与串行通信的区别如下表所示。 串行通信的分类 1、按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输; 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。 全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。 2、按照通信方式,分为: 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口。 异步通信:不带时钟同步信号。比
[单片机]
STM32常见的<font color='red'>串行通信</font>接口
中国VC为什么不投芯片?投资人:利润和卖肥皂差不多
   不过两年前,峰瑞资本创始合伙人李丰就思考过这个问题。当时他得到同行的回答是——“这不是VC该投的。”理由是,在上一个周期里,投资芯片的人基本没挣到钱。    而美国制裁中兴事件让芯片、半导体行业的发展现状再次突现到大众眼前,据来自中国半导体行业协会统计,2017年国内集成电路进口价值为2601亿美元,是我国第一大进口商品。    资本都是逐利的,芯片市场这个的“大蛋糕”却鲜有人问津,而相比于国内过于追逐商业模式创新,技术创新为何没有引起足够的重视?    投资芯片获得利润和卖肥皂差不多    “中国VC不是不投芯片,之前我们投了好几个都血本无归。”在2018年投中集团年会上,曾投资了滴滴、饿了么、ofo等风口上企业的金沙
[手机便携]
基于TMS320VC550的JPEG视频压缩系统的实现
   1 引言   随着网络和多媒体技术的发展,视觉通信的重要性和需求急剧增加,如桌面视频会议、移动终端、基于因特网的视频通信等。这些视觉信息内涵丰富,但数据量大,必须压缩数据。但采用多种方法压缩图像数据,其数据量仍然巨大,这就对计算机处理速度、传输介质、传输方法和存储介质提出较高要求。因此,数据压缩作为数据图像处理的关键技术之一,对研究图像压缩编码技术具有重要价值。   嵌入式微处理器中,DSP具有灵活、高速、便于嵌入式应用等优点,特别适合复杂算法处理的应用。数字视频图像压缩系统利用DSP作为其嵌入式平台,充分发挥其性能优势,较好地提高编码效率,满足图像实时处理需要。因此,这里介绍一种基于TMS320VC5509A型DSP的
[嵌入式]
Windows CE.NET 4.2中PC与单片机的串行通信
在工业控制中,常需要将单片机采集到的数据传送给PC机处理、显示,并且根据处理结果给单片机发送控制命令。串行通信虽然传送速度相对较慢,但是传送成本低,对实现监视和控制,具有足够的带宽,并且没有过于复杂的编解码,实现自定义的协议也不复杂,因而在工业自动化、通信和军事等领域的应用十分广泛。随着Windows CE嵌入式操作系统在工业控制中的广泛应用,设计和实现Windows CE下PC与单片机的串行通信具有重要的意义。 1Windows CE.NET 4.2简介 Windows CE 是一个面向移动计算和嵌入式应用的操作系统,其突出优点是模块化、可定制性、完备性、实时性、通信能力强大和基于Win32应用程序编程接口。 Windows
[单片机]
Windows CE.NET 4.2中PC与单片机的<font color='red'>串行通信</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved