WEB开发网
开发学院软件开发VC MSComm控件的Modem通讯 阅读

MSComm控件的Modem通讯

 2010-06-04 20:37:52 来源:WEB开发网   
核心提示:MSComm 控件通过串行端口(serial port)传送和接收数据,为应用程序提供了串行通讯功能,而且在可视化编程盛行的今天,MSComm控件的Modem通讯,可以很方便的在Visual Basic(VB)、Visual C++(VC)、Delphi等语言及开发平台中应用,MSComm 是 Microsoft 公司

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

1 2  下一页

Tags:MSComm 控件 Modem

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接