在开发微机控制系统的过程中,我们经常需要通过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控件开发串行通信程序是一个常见的任务,特别是在嵌入式软件上位机开发中。ActiveX控件是Microsoft提出的一种组件技术,它允许开发者通过简单的对象模型来实现复杂的功能,例如串口通信。MFC...
在开发微机控制系统时,串行通信是一种常见的通信方式,特别是在连接外部设备如分级控制系统中的上下位机或数据采集系统中的计算机与数字仪表时。在早期的DOS系统中,串行通信编程需要深入理解硬件层面,包括串行...
总的来说,利用VC++和ActiveX控件进行串行通信,尤其是使用MSCOMM控件,能够显著简化编程过程,提高效率,并且使得串行通信的逻辑更加清晰易懂。通过掌握这些技术,开发者可以构建高效、可靠的单片机与计算机之间的...
### 在VC++中利用ActiveX控件进行串行通信的方法 #### 1. 引言 串行通信作为一种常见的数据交换方式,在计算机与外部设备之间的交互中占据着重要的位置。其特点包括连接简单、使用灵活方便以及数据传输可靠性高。在...
在压缩包中的文件“在VC++中利用ActiveX控件开发串行通信程序.txt”很可能是详细的步骤指南或者代码示例,涵盖了以下知识点: 1. **ActiveX控件介绍**:ActiveX控件是COM(Component Object Model)组件的一种形式...
"在VC++中用ActiveX控件实现与单片机的串行通信" 在VC++6.0中使用ActiveX控件通过串口与单片机进行二进制数据传输的具体方法 一、MSCOMM控件 MSCOMM控件,即Microsoft Communication Control,是Microsoft为简化...
#### 六、在VC++中利用ActiveX控件开发串行通信程序 在使用ActiveX控件如MSComm开发串行通信程序时,需要注意控件的初始化和事件处理。例如,可以设置控件的OnComm事件来处理接收到的数据。此外,还需要注意数据...
使用ActiveX控件可以在VC环境中快速构建具备串行通信能力的上位机软件,这对于嵌入式系统的开发来说是一个非常实用的技术。通过掌握上述知识点,开发者不仅能够高效地完成项目开发,还能提高软件的可靠性和易用性。
本文将深入探讨如何在VC++中利用ActiveX控件MSComm来开发串行通信程序,同时也会介绍一个单片机串行数据采集/传输模块的设计。 首先,让我们了解什么是MSComm控件。MSComm(Microsoft Communications Control)是...
本文主要介绍了基于ActiveX控件的串口通信技术,它主要应用于实时监控系统和通信系统中,通过RS232串行接口与外部设备进行通信。该技术可以使应用开发者只需关心数据的业务逻辑处理,编写少量的代码即可轻松高效地...
1. **MSCOMM串口通信控件**: MSCOMM控件是Microsoft提供的一种ActiveX控件,用于在Visual C++等环境中实现串行通信。它简化了与串行端口的交互,提供了发送和接收数据的API接口。 2. **异步串行通信**: 异步串行...
在VC++中进行串行通信程序设计,有两种主要方法:直接使用VC++访问串口以及利用Microsoft Communications Control(MSComm)这一ActiveX控件。本文着重介绍使用MSComm控件来实现串行通信。 ActiveX控件是Windows...
在单片机与DSP的应用系统开发中,...以上就是使用VC++中的ActiveX控件MSCOMM实现与单片机串行通信的基本方法。通过这种方式,开发者可以专注于上层应用逻辑,而不必深陷于底层通信细节,从而提高开发效率和代码可读性。
在“ActiveX控件串口通讯”这个主题中,我们主要讨论的是如何通过ActiveX技术实现计算机与外部设备(如RFID读卡器)之间的串行通信。串口通讯,即串行接口通信,是设备间进行数据传输的一种方式,常用于低速、短距离...
MSComm32.ocx 是一个ActiveX控件,主要用于串行通信(Serial Communication)的编程。在Windows应用程序开发中,它为开发者提供了一个简便的方式来处理串行端口,如COM1、COM2等。这个控件在VB6(Visual Basic 6)、...
MSComm(Microsoft Communication Control)是微软提供的一个用于串行通信的ActiveX控件,它能够通过计算机上的串行端口(通常称为COM端口)进行数据的发送和接收,从而为开发人员提供了一个简便的方式来添加串行...
在"VC++串口通信编程实践(中)"的学习资料中,你可能会找到关于如何创建和配置MSCOMM控件,编写发送和接收数据的示例代码,以及如何处理串口通信中的异常和错误的实例。这些源代码和程序资料可以帮助你深入理解串口...
**mscomm控件**(Microsoft Communications Control)是微软提供的一种用于串行通信的ActiveX控件,它允许应用程序通过COM端口与外部设备进行通信。这种控件非常适用于Windows平台下的开发工作,尤其是在与单片机等...