• vc++下MSComm控件的串口通信方法


    转自:吉翔的博客   http://jixiang1119.blog.163.com/blog/static/2827097320091283321941/

    0       引言 

    随着计算机网络和多微机系统的广泛应用,接口通信技术日益成为当今一门非常重要的关键性技术。计算机与计算机以及其他设备的通信方式有串口通信,并口通信,USB通信和以太网通信等多种通信方式。尽管当今USB通信技术和以太网技术快速发展,然而串口通信技术始终以其连接简便,价格低廉,稳定可靠等优点,在计算机通信领域占有一席之地。MSComm控件是微软公司为了用户使用方便,而提供的一种便捷的控制串口编程的解决方案,本文将利用VC++平台详细介绍VC++下利用MSComm控件的 
    串行通信方法。 
    1       VC++下MSComm控件的串口编程简介 
    1.1   MSComm控件串行通信处理方式 
       ActiveX是 Windows下进行应用程序开发的崭新技术,它的核心内容是组件对象模型 COM (Component Object Model),ActiveX控件包括一系列的属性、方法和事件 ,使用ActiveX控件的应用程序和 ActiveX控件之间的工作方式是客户/服务器方式,即应用程序通过 ActiveX控件提供的接口来访问 ActiveX控件的功能。Microsoft Communications Control (以下简称 MSComm)是 Microsoft 公司提供的简化 Windows 下串行通信编程的ActiveX控件 ,它为应用程序提供了通过串行接口收发数据的简便方法。程序员不需要花时间去了解复杂的API函数,只需要利用MSComm控件就可实现串口编程。 
       MSComm控件提供了两种处理通信问题的方法:一是事件驱动(Event-Driven)方法,二是查询法。 
    1)  事件驱动方式 
    事件驱动方式是处理串行端口交互作用的一种非常有效的方法。使用事件驱动法设计程序时 ,每当有新字符到达或端口状态改变 ,或发生错误时 ,MSComm 控件的OnComm事件捕获并处理这些通信事件。而应用程序在捕获该事件后,通过检查 MSComm 控件的 CommEvent 属性可以在OnComm事件处理函数中加入自己的处理代码,这种方法由于程序响应及时可靠,在实际生活中经常使用。 
    2)  查询方式 
    查询的实质实际上仍然是事件驱动,这种方法应用程序每当执行完某一串行口操作后,将不断的检查CommEvent属性的值来查询事件或错误,如果应用程序较小,而且是自保持的,那么这种方法可能比较可取。 

    1.2   MSComm 控件的属性 

    MSComm控件有许多属性,其中非常重要的几个属性如下: 
    CommPort :设置并返回通信端口号。 
    Setting:以字符串的形式设置并返回波特率,奇偶校验位,数据位,停止位。 
    PortOpen:设置并反返回通信端口的状态。也可以打开和关闭端口。 
    Input:从接收缓冲区返回和删除字符 
    Output:向传输缓冲区写一个字符 
    2       MSComm控件串口通信编程实例 
    2.1 创建串口通信程序工程MySCommTest 
       打开 Visual C + + 6. 0 集成开发环境 ,创建一个基于对话框的 MFC应用程序项目 ,命名为MySCommTest,完成这一步后 ,选择菜单项 Project/Add to Project/ Components and Controls,将弹出一个对话框,选择 “Registered ActiveX Controls” 文件夹下的 “Microsoft Communications Control,version6.0”,再点击“Insert”按钮为当前工程添加CMSComm类,并提示CMSComm类的头文件为MSComm.h,实现文件为MSComm.cpp。点击“ok”按钮,再点击“close”关闭对话框。这样就为当前工程添加了一个CMSComm类。同时在对话框编辑器里的工具栏将出现 MSComm 控件图标,形状类似电话机, 这就是MSComm 控件,要在对话框中应用该控件,还需要将该控件用鼠标拖入对话框中,这个对话框就成了MSComm控件的容器或者说是“宿主”。同时还要在对话框中添加的控件有:两个静态文本控件IDC_STATIC(其标签分别设为“发送数据”和“接收数据”),两个编辑框控件IDC_EDIT1和IDC_EDIT2,并分别为其添加成员变量m_strEditTXData和m_strEditRXData。变量类型为CString。一个按钮控件IDC_BUTTON1,其标签设为“发送”。 
    2.2        串口初始化 
       右键点击对话框,选择ClassWizard->Member Variables页,选中IDC_MSCOMM1控件,再点击“Add Variable…”在CMySCommTestDlg类中为串口控件添加CMSComm类的控制变量m_ctrlcomm。 
    在MySCommTestDlg::OnInitDialog( )函数中写入对串口的初始化语句。通过串口初始化变量m_ctrlcomm来设置串口控件的属性。 
    初始化代码示例如下: 
    BOOL CMySCommTestDlg::OnInitDialog( ) 

       。。。。 
    // TODO: Add extra initialization here 
        m_ctrlcomm.SetCommPort(1);  //选择com1 
    //波特率9600,无校验,8个数据位,1个停止位 
               m_ctrlcomm.SetInputMode(1);  //1表示输入方式为二进制输入方式,0代表文本方式 
            m_ctrlcomm.SetInBufferSize(1024); // 设置输入缓冲区大小 
        m_ctrlcomm.SetOutBufferSize(512); // 设置输出缓冲区大小 
        //波特率9600,无校验,8个数据位,1个停止位 
        m_ctrlcomm.SetSettings("9600,n,8,1"); 
            if(!m_ctrlcomm.GetPortOpen()) 
               m_ctrlcomm.SetPortOpen(TRUE); //打开端口 
               m_ctrlcomm.SetRThreshold(1);  //1表示每当串口接收缓冲区中多余或等于一个字符时将触发OnComm事件 
               m_ctrlcomm.SetInputLen(0); //设置当前接收区数据长度为0 
               m_ctrlcomm.GetInput(); // 先预读缓冲区以清除残留数据 

        return TRUE;  // return TRUE  unless you set the focus to a control 

    2.3 串口事件处理函数OnComm( ) 
       MsComm控件一般用事件驱动方式从串口接收数据,事件驱动法完成对数据的监视和处理,有事件发生时或者出错时通知应用程序,并在程序中捕捉并处理这些事件。 
      右击对话框打开ClassWizard->Member Variables页,选中IDC_MSCOMM1控件,然后在Message中双击OnComm,为串口事件添加OnComm()消息处理函数。消息处理函数试对串口事件的处理,根据自身需要编写,本例的消息处理函数OnComm()主要是从串口接收数据并显示在接收数据编辑框中。 
      示例代码为: 
    void CMySCommTestDlg::OnComm()  //使用MSComm控件的事件驱动方式接收串口数据 

    // TODO: Add your control notification handler code here 
    VARIANT  variant_inp; 
    COleSafeArray  safearray_inp; 
        LONG len,k; 
        CString strtemp; 
    BYTE rxdata[2048]; //设置BYTE数组 
       if( m_ctrlcomm.GetCommEvent()==2)  //事件值为2表示接收缓冲区内有字符 

       { variant_inp=m_ctrlcomm.GetInput(); //读缓冲区 
          safearray_inp=variant_inp; //VARIANT变量转化为COleSafeArray变量 
          len=safearray_inp.GetOneDimSize(); //得到有效的数据长度 
      for( k=0;k<len;k++) 
      { 
               
             safearray_inp.GetElement(&k,rxdata+k); //转换成BYTE型数组 
      } 
      for( k=0;k<len;k++)  //将数组转换成Cstring型的变量 
      {   BYTE bt=*(char*)(rxdata+k); //字符型 
          strtemp.Format("%c",bt);  //将字符送入临时变量 
              m_strEditRXData+=strtemp; //加入接收编辑框对应字符串 

          } 

       } UpdateData(FALSE); //更新编辑框内容 
         


    2.4   串口读写操作 
       在串口数据的发送和就收过程中都是使用的VARIANT数据类型,因此我们必须把CString字符串数据转换成variant数据进行串口数据传送。 
      同样的方法为按钮IDC_BUTTON1添加处理函数BIN_CLICKED,并在函数中添加如下处理代码: 
    void CMySCommTestDlg::OnButton1()   //把CString字符串类型数据强制转换为variant类型数据从串口发送 

    // TODO: Add your control notification handler code here 
    UpdateData(TRUE);  //读取编辑框内容 
    m_ctrlcomm.SetOutput(COleVariant(m_strEditTXData)); //发送数据 

    2.5   关闭串口 
       串口在进行数据处理完毕后,要关闭串口以释放串口,即将PortOpen()的属性设置为FALSE。至此一个完整的串口通信程序完成了。并经过串口调试助手测试,程序顺利运行。可以用文件的方法保存接收框的数据。添加一个“保存”按钮,为按钮添加单击事件,事件名为OnSave用以保存接收数据
    void CSCommTestDlg::OnSave() 
    {  FILE *fp;
       if((fp=fopen("data.txt","w+"))==NULL)
        exit(0);
       fprintf(fp,m_strEditRXData);
       fclose(fp);
     
    }

    3       结束语 
    本文详细介绍了VC++下的MSComm控件编程方法,通过MSComm控件用户可以十分便捷的写出灵活性高,移植性强的串口通信程序,避免了去了解一些复杂的windows API函数。这种方法具有很强的实用性,可以广泛的用于工业数据采集等领域。
  • 相关阅读:
    yum安装报错“rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID 1e5e0159”
    EM64T和64位是不是一个概念啊?他们有什么区别啊,怎么区分啊?
    Can't load IA 32-bit .dll on a AMD 64-bit platform
    中间件——Oracle Fusion Middleware
    Does Windows have a limit of 2000 threads per process?
    java8 Lambda Stream操作list,map
    Mybatis优雅存取json字段的解决方案
    网站服务器架构部署方案发展
    springboot flowable Cause: org.xml.sax.SAXParseException; lineNumber: 25; columnNumber: 14; 元素类型为 "include" 的内容必须匹配 "EMPTY"
    java.lang.NoClassDefFoundError: javax/el/ELManager
  • 原文地址:https://www.cnblogs.com/call-from-dream/p/6238293.html
Copyright © 2020-2023  润新知