`
javasogo
  • 浏览: 1775431 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

在VC++中利用ActiveX控件开发串行通信程序

阅读更多
在开发微机控制系统的过程中,我们经常需要通过RS-232串行接口与外部设备进行通信。例如分级控制系统中上位机与下位机的数据交换以及数据采集系统中计算机与数字仪表的通信等。在DOS时代,编写串行通信程序是一件相当复杂的工作,程序员需要具备相当的硬件知识,对可编程串行通信接口芯片的内部寄存器定义、工作方式、指令字等相关内容有所了解,才有可能着手编写程序,大量的时间和精力都花在了如何与硬件打交道上,而不是花在我们的主要目的——获取与处理数据上;在Windows下,Win32API提供了使用CreateFile/WriteFile等文件I/O函数进行串行口操作的方法,但是在实现上仍然是相当烦琐的。幸运的是,Windows平台先进的ActiveX技术使我们在对串行口编程时不再需要处理烦琐的细节。利用已有的ActiveX控件,我们只需要编写少量的代码,就可以轻松高效地完成任务。本文以Windows 98下用Visual C++6.0开发PT650C秤重显示器的通信模块为例,探讨了使用Microsoft Communications Control控件进行串行通信的方法。
1 ActiveX控件介绍
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 查询法
这种方法适合于较小的应用程序。在这种情况下,每当应用程序执行完某一串行口操作后,将不断检查MSComm控件的CommEvent属性以检查执行结果或者检查某一事件是否发生。例如,当程序向串行设备发送了某个命令后,可能只是在等待收到一个特定的响应字符串,而不是对收到的每一个字符都立刻响应并处理。
MSComm控件有许多重要的属性,其中首要的几个如表1所示。
表1
属性
说明
CommPort 设置/获取控件对应的串行口
Settings 设置/获取波特率、校验方式、数据位、停止位
PortOpen 打开/关闭通信口
Input 读取数据
Output 发送数据
2 编程实现
在使用MSComm控件开发PT650C秤重显示器通信程序时,采用了事件驱动法,主要是在comEvReceive(接收到数据)事件发生时响应并获取缓冲区中的数据。以下具体介绍实现方法。
打开Visual C++6.0集成开发环境,创建一个基于对话框的MFC应用程序项目,命名为MyCOM,记住在设置项目选项时必须选上ActiveX Controls,其他的按照缺省设置。完成这一步后,选择菜单项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_wnd COM1。由于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个字符就触发一个接收数据事件)
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 TRUE unless you set the focus to a control
}
接下来为程序主对话框建立响应MSComm事件的处理函数,每当MSComm控件触发事件时该函数将被调用。在对话框编辑器中用鼠标左键双击MSComm控件图标,在弹出的对话框中输入函数名OnCommCOM1,该事件处理函数的原型定义和消息映射入口将自动被添加到CMyCOMDlg类中,我们所要做的只是在OnCommCOM1函数中给出具体的数据处理程序段,代码示例如下:
void CMyCOMDlg::OnCommCom1()
{
//TOD O:Add your control notification handler code here
CString sInput;
switch(m_wndCOM1.GetCommEvent())
{
case 1: //comEvSend事件
/*如有数据要发送,可采用以下代码:
VARIANT varOut;
VariantInit(&varOut);
varOut.vt=VT_BSTR;
USES_CONVERSION;
varOut.bstrVal=SysAllocString(T2OLE)("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字符串的转换
分享到:
评论

相关推荐

    通信与网络中的在VC++中利用ActiveX控件开发串行通信程序

    在DOS时代,编写串行通信程序是一件相当复杂的工作,程序员需要具备相当的硬件知识,对可编程串行通信接口芯片的内部寄存器定义、工作方式、指令字等相关内容有所了解,才有可能着手编写程序,大量的时间和精力都花...

    VC实用高级编程

    在VC++中利用ActiveX控件开发串行通信程序 用VC控件MSComm编写串口通信程序的源代码,并写出详细的编程过程 一个单片机串行数据采集/传输模块的设计

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

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

    VC串口通信资料汇集整理(PDF)

    (1)用MFC实现串口编程 (2)SerialCommunicationsinWin32 (3)多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序 ...(7)在 VC++ 中利用 ActiveX 控件开发串行通信程序 (8)如何在串口通讯程序中处理数据包

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

    在单片机应用系统中,经常需要通过RS-232串行口与微机进行通信。Microsoft推出的ActiveX技术提供了另外一种实现串行通信的方法。这种方法不仅相对较为...下面详细讨论Microsoft提供的串行通信ActiveX控件的使用方法。

    VC中ActiveX控件

    很方便的用VC自带的ActiveX控件开发串行通信上位机软件,对于很多嵌入式系统而言,很有用!

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

    摘要:详细论述在VC++6.0中使用ActiveX控件通过串口与单片机进行二进制数据传输的具体方法。  关键词:VC++ ActiveX 串行通信 在单片机应用系统中,经常需要通过RS-232串行口与微机进行通信。目前在各种操作系统...

    VC++中串行通信程序设计

    O 引言  在很多情况下,远程监控和自动化领域系统常见的通信编程多为串口通信编程。...另一种是利用Microsoft公司提供的ActiveX控件Microsoft CommunicatioNS Control。本文将主要介绍第二种方法。  

    EDA/PLD中的VC++中串行通信程序设计

    O 引言  在很多情况下,远程监控和自动化领域系统常见的通信编程多为串口通信编程。...另一种是利用Microsoft公司提供的ActiveX控件Microsoft Communications Control。本文将主要介绍第二种方法。

    控件开发技术资料 玩转mfc

    控件开发技术资料 用 ATL ActiveX 绘制任意平面函数的曲线 VC++中用ActiveX控件实现与单片机的串行通信 ActiveX控件开发

    VC++2010权威开发指南+源代码.part2

     第11章 VisualC++2010MFCActiveX控件  第12章 VisualC++2010MFC文件与注册表操作  第13章 VisualC++2010MFC数据库开发  第14章 VisualC++2010MFC多线程程序设计  第15章 VisualC++2010MFC网络程序设计  第16...

    用VC++实现单片机与PC机串口通信的三种方法

    在VC++6.0开发平台上,本文介绍运用MSComm控件、WindowsAPI函数、CSerid类实现 单片机与PC机串口的通信。 VC++6.0是微软公 司于1998年推出的一种开发环境,以其强大的功能, 32位面向对象的程序设计及ActiveX的灵活...

    c++串口通信技术介绍与实现

    本文详细介绍了串行通信的基本原理,以及在Windows NT、Win98环境下用MFC实现串口(COM)通信的方法:使用...关键词:串行通信、VC++6.0、ActiveX控件、Win API、MFC32位应用程序、事件驱动、非阻塞通信、多线程.

    VC++2010权威开发指南+源代码

     第11章 VisualC++2010MFCActiveX控件  第12章 VisualC++2010MFC文件与注册表操作  第13章 VisualC++2010MFC数据库开发  第14章 VisualC++2010MFC多线程程序设计  第15章 VisualC++2010MFC网络程序设计  第16...

    MFC.rar_MFC事件驱动_MFC多线程阻塞_VC 串口通信_VC API_visual c++ api

    用MFC实现串口编程, 本文详细介绍了串行通信的基本原理,以及在Windows NT、Win98环境下用MFC ...关键词:串行通信、VC++6.0、ActiveX控件、Win API、MFC32位应用程序、事件驱动、非阻塞通信、多线程.

    用MFC实现串口编程

    本文详细介绍了串行通信的基本原理,以及在Windows NT、Win98环境下用MFC实现串口(COM)通信的方法:使用...关键词:串行通信、VC++6.0、ActiveX控件、Win API、MFC32位应用程序、事件驱动、非阻塞通信、多线程.

    VisualC__NET平台上GPS串行通信的实现

    提出了利用Windows API 通信函数、使用串口通信组件(ActiveX控件MSComm)、利用第三方提供或自己编写的通信类三种方法,在VC++.NET 平台上实现对GPS 全球定位系统定位信息的接收,并以GPGGA 数据格式为例提供了对各...

    孙鑫C++教程(全20讲)PPT讲义源码及电子书

    最近正在学习C++,费了很多心思,分亨一下我的学习资源,孙鑫C++教程(全20讲)PPT讲义源码...第十八课:ActiveX控件 第十九课:动态链接库 第二十课:HOOK和数据库访问 希望对大家的学习有帮助,如果不错,请帮点个赞,谢谢

Global site tag (gtag.js) - Google Analytics