注册 | 登录
收藏 | 帮助
热门文章
编辑推荐
相关文章  
Norton AntiVirus 2005测试版截图
快速有效地封杀—巧利用Iris来查
从Melissa到Zotob:Windows蠕虫1
快速有效地封杀—巧利用Iris来查
IIS的NSIISLOG.DLL溢出问题分析
IIS存在未明远程攻击漏洞
保护(IIS)web服务器的15个技巧
Microsoft AntiSpyware微软出品的
提高操作系统和IIS安全性的绝招
Windows Vista系统防火墙初探
您现在的位置: 顶尖设计 >> IT学院 >> 编程开发 >> VB >> 文章正文
Visaul C++6.0中使用串行通信控件
作者:佚名  来源:不详  点击:  更新:2006-12-19
简介:
目前,在用计算机进行数据传输时,常用的是串行通信方式。在Visual C++的编程中,既可以用Windows API函数进行串行通信编程,也可以利用环境自带的控件进行编程。利用 API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难。但是使用串行通信控件就相对简单一些,而且功能强大,性能安全可靠。

  本文以Microsoft Communications Control(version 6.0)为例,介绍串行通信控件在VC++中的使用方法。

   嵌入通信控件

  使用串行通信控件前,首先要进行系统注册。

  1、在建立新工程时,将ActiveX Controls复选框选中,表示本程序支持ActiveX 控件。

  2、单击Project菜单,从中选择Add to Project,在弹出的对话框中单击Components and Controls选项,然后在弹出的对话框中再单击Registered ActiveX Controls选项。

  3、在列表中选择Microsoft Communications Control (version6.0),形状为带有红色底座的黄色电话机。单击Insert按钮,确认后,会出现一个Confirm Classes对话框,其中列出了该控件的类名(CMSComm)、头文件名(MSComm.h)、执行文件名(MSComm.cpp)。

  关闭此对话框,在程序主界面的控件列表中,可以看到该通信控件已被加入,拖动该控件就可以将其放入程序中。

   编写通信程序

  通信控件的工作原理类似于中断方式,当有通信事件发生时,如发送、接收数据,就会触发OnComm事件。在OnComm事件的处理函数中调用 GetCommEvent()函数,由该函数的返回值即可确定是什么类型的事件,并由此做出相应的处理。

  下面以接收处理串口的GPS信号为例,说明该控件在编程中的具体应用。

  利用MFC生成一个基于对话框的应用程序,对话框中的控件及其相应的消息与响应函数如下表所示。 控件名称 控件 ID 对应变量 通信控件 IDC_MSCOMM m_Comm 接收按钮 IDC_BUTTON_RECEIVEGPSDATA OnbuttonStartreceivegps() GPS信号显示 IDC_EDIT_COMDATA m_comdata 停止接收按钮 IDC_BUTTON_ENDRECEIVEGPSDATA OnbuttonEndreceivegps()   设置控件各部分属性:

   CommPort:1;
   DTREnable:1;
   InBufferSize:4096;
   EOFEnable:TRUE;
   Handshaking:nohandshaking;
   InputMode:1-Binary;
   NullDiscard:False;
   Rthreshold:250;
   RTSEnable:False;
   Settings:9600,n,8,1;
   Sthreshold:0。

  部分程序如下: //开始接收GPS信号
void CGpsDlg::OnButtonStartreceivegps()
{
 //判断串口的状态,如果是关闭状态,则打开
 if(!m_Comm.GetPortOpen() )  
 //打开串口
  m_Comm.SetPortOpen(TRUE);
 UpdateData(TRUE);
}
//停止接收GPS的信号
void CGpsDlg::OnButtonEndreceivegps();
{
 //判断串口的状态,如果是打开状态,则关闭
 if( m_Comm.GetPortOpen() )
  m_Comm.SetPortOpen(FALSE);
 UpdateData(FALSE);
}
//相应的OnComm事件处理
void CGpsDlg::OnComm()
{
 m_comdata.Empty();
 VARIANT m_input1;
 COleSafeArray m_input2;
 LONG length,i;
 BYTE data[1024];
 CString str;
 //接收缓冲区内字符
 if(m_Comm.GetCommEvent()== 2)
 {
  m_comdata.Empty();
  //读取缓冲区内的数据
  m_input1=m_Comm.GetInput();
  //将VARIANT型变量转换为ColeSafeArray型变量
  m_input2=m_input1;
  //确定数据长度
  length=m_input2.GetOneDimSize();
  //将数据转换为BYTE型数组
  for(i=0;i < length;i++)
   m_input2.GetElement(&i,data+i);
   //将数组转换为CString型变量
  for(i=0;i < length;i++) {
   char a=* (char *)(data+i);
   str.Format(“%c",a);
   m_comdata += str;
  }
  /*在上面的程序中,先将VARIANT型变量
  转换为ColeSafeArray型变量,再将其转换为
  BYTE型数组,然后将数组转换为CString型变量,
  以满足不同的变量类型显示数据的需要。*/
  //提取GPS信号
  CString m_zjz;
  m_zjz=m_comdata;
  //寻找GPS信号的头标志
  int s;
  s=m_zjz.Find(“$GPRMC,");
  CString m_gps;
  //NUM为所提取GPS信号的长度
  m_gps=m_zjz.Mid(s,NUM);
  int x;
  x=m_gps.GetLength();
  //信号长度不符合要求,则拒绝接收
  if (x != NUM) {
   m_gps.Empty();
  }
  //寻找所需要的GPS信号的头标志
  int y;
  y=m_gps.Find(“$GPRMC,");
  if (y != 0)
  {
   m_gps.Empty();
  }
  //m-gpsdata是已声明的类成员变量
  m_gpsdata=m_gps;
 }
}   这样就将GPS信号的数据流提取出来了。再通过简单的字符串操作就可以分别找出GPS信号中的经度、纬度以及相对应的格林威治时间等定位信息。

  以上程序在Win98/95/NT、P133 PC机、ROCKWELL JUPITER GPS接收板环境下调试通过。






  • 上一篇文章:
  • 下一篇文章:
  • 分享此文:该页面添加到 Mister Wong 添加到雅虎Yahoo!收藏 Add to:Del.icio.us Post to Furl Digg this 添加到Google书签 reddit spurl blogmarks 365Key 评论  收藏  分享  打印
     我来说两句
    姓名:       验证码:   
    主页: 
    评分: 1分 2分 3分 4分 5分
    本频道近期热评文章:
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备07504942号 
    网络110
    报警服务