资源大全 | 神秘文化 | 在线翻译 | QQ专区 | 视频教程 | 彩信频道 | 搜索引擎 | BT下载 |  | 网站地图
设为首页
加入收藏
联系站长
您现在的位置: 一百网络 >> 其他编程 >> VB编程 >> 文档正文
最近更新
普通文档 定时提醒你休息的脚本
普通文档 用VB备份和恢复SQL Serv
普通文档 利用Visual Basic开发SA
普通文档 用DirectShow实现QQ的音
普通文档 Visual Basic数据库操作
普通文档 在VB中存取数据库中的图
普通文档 VB实现图像在数据库的存
普通文档 在VB中用DAO实现数据库编
普通文档 VB实现SQL Server 2000存
普通文档 基于Visual Basic 6的网
推荐文章
  • 此栏目下没有推荐文档
  • Visaul C++6.0中使用串行通信控件

    文章作者:佚名 录入时间:2006-6-2 来源:不详
    网站声明:本站的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出处和原始作者,文章版权归本网站与文章作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。


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

  • 上一篇文档:

  • 下一篇文档:
  •     查找更多“Visaul C++6.0中使用串行通信控件”的内容  
    相关连接
  • 将Java程序变成Windows系统服务

  • 浅析Java多线程程序设计机制

  • Java初学者需掌握的30个基本概念(1)

  • JDBC 入门(1)

  • 面向Java程序员的Ajax:构建动态Java程序(1)