手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

VisaulC 6.0中使用串行通信控件

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  目前,在用计算机进行数据传输时,常用的是串行通信方式。在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接收板环境下调试通过。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS