VC 运用MSComm控件串口通信

      在VC++的平台下,串口通信一般存在两种形式:1.直接通过API函数设计通信的参数等,这种方式的好处在于与实际的结合比较的灵活,缺点是编码的工作量比较大,要了解通信的各个环节的话就必须弄懂每个API函数的具体意思。2.使用VC++提供的串行通信控件MSComm,这种方法编码简单易懂,但是不够灵活。

       本文就主要介绍第二种方法。

       首先,选择菜单-->添加到工程-->选择Component and Controls Gallery文件夹-->选定Registered ActiveX Controls文件夹,选定Microsoft Communications Control, version 6.0控件,然后将该控件从工具箱拖到对话框里面。

       其次,设置MSComm控件的属性,下面主要介绍MSComm的几个属性: 

       m_Comm.SetCommPort(1);//设定的串口号,1表示选择的串口号是1 
       m_Comm.SetInBufferSize(1024);//设置接受缓冲区的大小

       m_Comm.SetOutBufferSize(1024);//设置发送缓冲区的大小

       m_Comm.SetInputMode(1);  //0是以文本的形式取出数据,1是以2进制的形式取出数据

       m_Comm.GetInput();//先预读缓冲区以清除残留数据

       m_Comm.SetSettings("9600,N,8,1"); //波特率9600,无校验,8个数据位,1个停止位  
       m_Comm.SetInputLen(0);  //设置当前接收区数据长度为0, 设置成从缓冲区读取全部内容
       m_Comm.SetRThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

       if( !m_Comm.GetPortOpen())
       {
            m_Comm.SetPortOpen(TRUE);//打开串口 
       }

      最后在OnComm事件里面添加接受数据的具体代码,下面是本人在曾经在项目中的一段代码,仅供参考:

       VARIANT Rec_Data;  
      char Rec_Data_Array[2048];
      if (m_Comm.GetCommEvent() == 2) //事件值为2表示接收缓冲区内有字符
     {
           Rec_Data = m_Comm.GetInput();//从缓冲区取出数据
           int Data_Len = Rec_Data.parray->rgsabound->cElements; //取出一维的数据个数
           memcpy(Rec_Data_Array, (char*) Rec_Data.parray->pvData, Data_Len); //拷贝出数据
           Rec_Data_Array[Data_Len] = NULL;
  
           CString str1;
           CString str2;
           for(int i = 0; i<Data_Len ; i++)
           {
                 str2.Format("%02x",Rec_Data_Array[i]);//16进制的形式接受数据
                 str1 = str2.Right(2);//取右边两位数据(注释:一般来说是不用取右边两位数据的,但是项目中实际测试还是要取右边2位数

                                                  据才能得到真正的结果,这行代码仅供参考,可以不要)

                 this->m_receive = this->m_receive +  str1;//m_receive就为接受的数据
           }
      
     } 

你可能感兴趣的:(工作,api,Microsoft,测试,null,工具)