Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1852497
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 22:09:20

一起学习
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

        以上是在做工程之余写下的一点东西。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流控方式

下载本文示例代码


MSComm 控件的 Modem 通讯MSComm 控件的 Modem 通讯MSComm 控件的 Modem 通讯MSComm 控件的 Modem 通讯MSComm 控件的 Modem 通讯MSComm 控件的 Modem 通讯MSComm 控件的 Modem 通讯MSComm 控件的 Modem 通讯MSComm 控件的 Modem 通讯MSComm 控件的 Modem 通讯MSComm 控件的 Modem 通讯MSComm 控件的 Modem 通讯
阅读(295) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~