中国IEEE
关于我们 | 会员登陆 | 收藏本站 | 留 言 薄
 

 | 网站首页 | 电子知识 | 单片机知识 | 电路设计 | 微电子技术 | SCADA系统 | 资源下载 | 给我留言 | 谷歌商城 | 视频教程 | ieee | 
热门搜索关键字: 单片机教程 | 三极管 | 二极管 |  C语言汇编语言SCADA元器件模拟电子 |
cnieee.com baidu
栏目导航  
栏目更新推荐  
·单片机实现数据远程监控
·8051单片机C语言数据采集程序
·51单片机C语言学习
·自制51单片机试验板
·有目的的去学习
·用单片机实现高速数据采集
·单片机控制的模拟开关灯实验
·最常应用的流水闪烁灯实验
点击TOP(10)  
·自制51单片机试验板
图片文章  

单片机实现数据远程…

51单片机C语言学习

自制51单片机试验板

用单片机实现高速数…
 
您现在的位置: 中国IEEE中国电气电子工程师网 >> 单片机知识 >> 正文

在VC++中利用ActiveX控件开发串行通信程序
文章来源:不详 点击数: 更新时间:2008-5-6 【字体:
(欢迎光临中国IEEE,希望本文能对您有所帮助http://www.cnieee.com)


相关文章:

MCS-51 8位单片机(80C,87C/31,51,52,54,58)…
用VC++6.0实现PC机与单片机之间
用VC 6.0实现串行通信的三种方法…
μC/OS-II的实时性能分析

  • 上一个文章:

  • 下一个文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     
    关于〖在VC++中利用ActiveX控件开发串行通信程序〗的最新评论:

    作者: 上海交通大学B9703-1信箱(200030)黄海荣田作华   来源:《电子技术应用》

       摘要:探讨了在使用Visual C++编程时利用Microsoft Communications Control控件编写串行通信程序的方法,并给出了例程,具有一定的实用意义。

       关键词:Visual C++串行通信ActiveX      

       在开发微机控制系统的过程中,我们经常需要通过RS-232串行接口与外部设备进行通信。例如分级控制系统中上位机与下位机的数据交换以及数据采集系统中计算机与数字仪表的通信等。在DOS时代,编写串行通信程序是一件相当复杂的工作,程序员需要具备相当的硬件知识,对可编程串行通信接口芯片的内部寄存器定义、工作方式、指令字等相关内容有所了解,才有可能着手编写程序,大量的时间和精力都花在了如何与硬件打交道上,而不是花在我们的主要目的——获取与处理数据上;在Windows下Win32API提供了使用CreateFile/WriteFile等文件I/O函数进行串行口操作的方法,但是在实现上仍然是相当烦琐的。幸运的是,Windows平台先进的ActiveX技术使我们在对串行口编程时不再需要处理烦琐的细节。利用已有的ActiveX控件,我们只需要编写少量的代码,就可以轻松高效地完成任务。本文以Winsows 98下用Visual C++6.0开发PT650C秤重显示器的通信模块为例,探讨了使用Microsoft Communications Control 控件进行串行通信的方法。

       1ActiveX控件介绍

       ActiveX是Windows下进行应用程序开发的崭新技术,它的核心内容是组件对象模型COM(Component Object Model)。ActiveX控件包括一系列的属性、方法和事件,使用ActiveX控件的应用程序和ActiveX控件之间的工作方式是客户/服务器方式,即应用程序通过ActiveX控件提供的接口来访问ActiveX控件的功能。

       Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。

       1.1事件驱动法

       在使用事件驱动法设计程序时,每当有新字符到达,或端口状态改变,或发生错误时,MSComm控件将解发OnComm事件,而应用程序在捕获该事件后,通过检查MSComm控件的CommEvent属性可以获知所发生的事件或错误,从而采取相应的操作。这种方法的优点是程序响应及时,可靠性高。

       1.2查询法

       b1.gif (10097 字节)这种方法适合于较小的应用程序。在这种情况下,每当应用程序执行完某一串行口操作后,将不断检查MSComm控件的CommEvent属性以检查执行结果或者检查某一事件是否发生。例如,当程序向串行设备发送了某个命令后,可能只是在等待收到一个特定的响应字符串,而不是对收到的每一个字符都立刻响应并处理。

       MSComm控件有许多重要的属性,其中首要的几个如表1所示。

       2编程实现

       在使用MSComm控件开发PR650C秤重显示器通信程序时,采用了事件驱动法,主要是在comEvReceive(接收到数据)事件发生时响应并获取缓冲区中的数据。以下具体介绍实现方法。

       打开Visual C++6.0集成开发环境,创建一个基于对话框的MFC应用程序项目,命名为MyCOM,记住在设置项目选项时必须选上ActiveXControls,其他的按照缺省设置。完成这一步后,选择菜单项Project/Add to project/Components and Controls……,将弹出一个对话框以选择系统中已有的组件(Components)和控件(Controls)。选择Registered ActiveX Controls件夹下的Microsoft Communications Control项并按下Insert按钮,将MSComm控件支持加入到本项目中。这时将生成一个名为CMSComm的c++类,并且在对话框编辑器里的工具栏将出现MSComm控件图标。CMSComm类是由MSComm控件导出的一系列接口函数构成的,利用它将可以访问MSComm控件的属性(Property)和方法(Method)。

       假设PT650C秤重显示器接在计算机COM1口上,那么打开资源编辑器,在程序主对话框(资源ID为IDD_MYCOM_DIALOG)上面放置一个MSComm控件,并用Class Wizard为该对话框类添加对应该控件的成员变量m_wndCOM1。由于PT650C秤重显示器与计算机进行串行通信时采用7个数据位、1个停止位、偶校验方式,并且波特率为2400/4800/9600可选,这里我采用9600波特率,在对话框编辑器中设置MSComm控件的属性如下:

       ID:IDC_COM1资源ID)

       CommPort:1(COM1)

       Settings:9600,e,7,1波特率9600,偶校验,7个数据位,1个停止位)

       RThreshold:1每接收到1个字符就触发一个接收数据事件)

       Sthreshold:0(不触发发送缓冲区空事件)

       InputLen:1每次读操作从缓冲区中取一个字符)

       其他选项按照缺省设置或者根据具体设备的要求进行设置。如果需要通过多个串行口与多台设备通信,那么每一个串行口对应于一个单独的MSComm控件。串行口的设置参数既可以在对话框编辑器里设定,也可以在程序代码中通过调用CMSComm类的成员函数设定。例如,我们可以在MyCOMDlg类的OnInitDialog成员函数中初始化MSComm控件的参数,代码如下:

       BOOL CMyCOMDlg::OnInitDialog()

    {

       CDialog::OnInitDialog();

       //以上为MFC框架自动生成的代码,在此不列出

       //TODO:Add extra initialization here

       m_wndCOM1.SetCommPort(1);

       m_wndCOM1.SetSettings("9600,e,7,1");

       m_wndCOM1.SetRThreshold(1);

       m_wndCOM1.SetSThreshold(0);

       m_wndCOM1.SetInputLen(1);

       m_wndCOM1.SetPortOpen(TRUE);//打开通信口

       return TRUE;//return TRUEunless you set the focus to a control

    }

       接下来为程序主对话框建立响应MSComm事件的处理函数,每当MSComm控件触发事件时该函数将被调用。在对话框编辑器中用鼠标左键双击MSComm控件图标,在弹出的对话框中输入函数名OmCommCom1,该事件处理函数的原型定义和消息映射入口将自动被添加到CMyCOMDlg类中,我们所要做的只是在OnCommCom1函数中给出具体的数据处理程序段,代码示例如下:

       void CMyCOMDlg::OnCommCom1()

    {

       //TPDP"Add your control notification handler code here

       CString sInput;

       switch(m_wndCOM1.GetCommEvent())

    {

       case 1://comEvSend 事件

       /*如有数据要发送,可采用以下代码:

       VARIANTvarOut;

       VariantInit(&varOut);

       varOut.vt=VT_BSTR;

       USES_CONVERSION;

      varOut.bstrVal=SysAllocString(T20LE("My data"));

       if(varOut.bstrVal){

       m_wndCOM1.SetOutput(varout);

       SysFreeString(varOut.bstrVal);

     }

     */

       break

       case 2://comEvReceiv 事件,有数据到达

       sInput=m_wndCOM1.GetInput().bstrVal;

       //对接收到的数据做必要处理

       break;

       case 1009://comEventRxParity事件,奇偶校验错误

       //错误处理代码

       break;

       default:

       break

    }

       在这里必须注意的一点是在发送字符数据时,必须向MSComm控件提供Unicode格式的字符串,在以上代码中用到了USES_CONVERSION和T2OLE宏进行ANSI字符串到Unicode字符串的转换,具体内容可参考Visual所带的MSDN文档,在此不加赘述。

       本文对Windows 98下Visual C++程序中使用MSComm串行通信ActiveX控件编程的方法做了探讨,显示了AcctiveX技术的强大功能、充分的灵活性和易用性,具有一定的实践意义。

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明网站地图 | 名站导航 | 管理登录 | 
    本站资源部分来自互联网,如侵犯您的权利,我们将予以删除  鲁ICP备08006092号
    本站欢迎同类网站做友情链接,QQ留言
    中国IEEE 中国电气电子工程师网 版权所有