中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 网络与通信
MSComm 控件的 Modem 通讯
作者:未知 时间:2005-07-20 14:18 出处:VC知识库 责编:chinaitpower
              摘要:MSComm 控件的 Modem 通讯

MSComm 控件的 Modem 通讯


作者:屈金学

下载源代码

  MSComm 控件通过串行端口(serial port)传送和接收数据,为应用程序提供了串行通讯功能。而且在可视化编程盛行的今天,可以很方便的在Visual Basic(VB)、Visual C++(VC)、Delphi等语言及开发平台中应用。
  MSComm 是 Microsoft 公司为简化Windows下串行端口编程而提供的ActiveX控件,它提供了一系列标准通讯命令的使用接口,为应用程序提供了通过串行口收发数据的简洁方法。处理数据的方式有事件驱动(Event-driver)、查询法(Inquire)两种。

1.事件驱动法

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

2.查询法

  这种方法适合于较小的应用程序。在这种情况下,每当应用程序执行完某一串行口操作后,将不断检查MSComm控件的CommEvent属性以检查执行结果或者检查某一事件是否发生。例如,当程序向串行设备发送了某个命令后,可能只是在等待收到一个特定的响应字符串,而不是对收到的每一个字符都立刻响应并处理。
  在VC中添加?MSComm控件非常简单。在打开的工程中,选择菜单Project->Add To Project->Component and Controls,在弹出的对话框“Component and Controls Gallery”中选中“Microsoft Communication Controls Version 6.0”?,单击“Insert”按钮即可完成添加MSComm控件操作。
本工程应用采用事件驱动法,具体实现如下:

一.串口信息配置
  按上述方法完成在基于对话框的应用程序中添加MSComm控件操作并增加相应成员变量m_comm。在对话框模板上右键单击MSComm控件,选择Property菜单项,即可设置MSComm控件各项属性。在此调制解调器通讯的程序中,设置“Control”属性页中Handshaking项为“2-comRTS”,否则国内部分厂家modem不能正常通讯。其它接受缺省设置。
  另外亦可通过修改对话框类的OnInitDialog()函数来设置控件的属性。具体参考MSDN中的关于Comm Control的详细说明。

  if(m_comm.GetPortOpen()) 
  { 
     m_comm.SetPortOpen(FALSE);	//设置串口配置信息前先要关闭串口 
  }                   
  
  m_comm.SetCommPort(1);		//Com1串行口       
  m_comm.SetSettings("9600,n,8,1");//设置波特率为9600bps,无奇偶校验位,数据位8位,停止位1位 
  m_comm.SetInputMode(1);		//设置数据通讯格式为二进制数组格式 
  m_comm.SetRThreshold(1);		//设置为每次接到一个字节数据就触发OnComm事件 
  if(!m_comm.GetPortOpen())  
  { 
     m_comm.SetPortOpen(TRUE); 
  }  
  m_comm.GetInput();		//清除串口输入缓冲区中残留数据 
  m_SendData="ATZ\r\n";		//调制解调器初始化 
  m_comm.SetOutput(COleVariant(m_SendData)); 
二.接收数据
  添加接收数据函数,在对话框中双击Comm Control,接受默认函数,则对话框类的成员函数为OnCommMscomm(),添加代码如下:
Sleep(500);   //视各厂家modem而定。不加则数据接受不全 
VARIANT m_input; 
char *str,*str1; 
int k,nEvent,i,len,m; 
CString str2; 
m_ReceiveData=""; 
nEvent=m_comm.GetCommEvent(); 
switch(nEvent) 
{ 
case 2:                              	//收到大于RTHresshold个字符 
	k=m_comm.GetInBufferCount();     	//接收缓冲区的字符数目 
	if(k>0) 
	{ 
        m_input=m_comm.GetInput(); 
        str=(char*)(unsigned char*)m_input.parray->pvData; 
	} 
	?i=0; 
	str1=str; 
	while(i<k) 
	{ 
        i++; 
        str1++; 
	} 
	*str1=''\0'';                               
	str2=(const char*)str;             	//清除字符串中的不必要字符 
	m_ReceiveData=(const char *)str; 
	break; 
case 3:       				//CTS线状态发生变化 
	break; 
case 4:       				//DSR线状态发生变化 
	break; 
case 5:       				//CD线状态发生变化 
	break; 
case 6:       				//Ring Indicator发生变化 
	break; 
} 
  以上是在做工程之余写下的一点东西。VC我是初学者,有错误的地方,还请各位批评指正。例子在VC 6.0+Win2000下调试通过。Win98下测试数据接收不全。还望高手指点一二。
E-mail:qjxue@21cn.com

附:
  单片机或PC机对MODEM的控制是通过设置MODEM的S寄存器和发送标准AT命令来实现的。命令行由AT或at开始,不能是At或aT。它的一般格式为“AT+指令+回车”常用的AT命令简介如下,详细的AT命令见本说明书附录。
&F 恢复出厂设置
DT××× 音频拨号, ×××表示电话号码
+++ 切换到在线命令状态
Sn=X 写S寄存器
Hn 摘机/挂机控制
n=0 挂机
n=1 摘机
S0=X X=0,不自动应答
X=1~255,振铃指定次数后自动应答
\N0 异步方式设定为0
\q0 XON\XOFF流控方式

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有