MFC中串口类的使用

来源:互联网 发布:如何检查网络是否正常 编辑:程序博客网 时间:2024/04/30 14:19

串口控件

 

//自动获取串口:

 voidCENVVAR_CONFIGDlg::GetCom()

{

   //程序启动时获取全部可用串口

    HANDLE  hCom;

     int i,num,k;

    CString str;

    BOOL flag;

   

   ((CComboBox *)GetDlgItem(IDC_COMBO_COM))->ResetContent();

   flag = FALSE;

   num = 0;

   for (i = 1;i <= 16;i++)

   {//此程序支持16个串口

       str.Format("\\\\.\\COM%d",i);

       hCom = CreateFile(str, 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);

       if(INVALID_HANDLE_VALUE != hCom )

       {//能打开该串口,则添加该串口

           CloseHandle(hCom);

           str = str.Mid(4);

           ((CComboBox *)GetDlgItem(IDC_COMBO_COM))->AddString(str);

            if (flag == FALSE)

           {

                flag = TRUE;

                num = i;

           }

       }

    }

    i= ((CComboBox *)GetDlgItem(IDC_COMBO_COM))->GetCount();

   if (i == 0)

   {//若找不到可用串口则禁用“打开串口”功能

       ((CComboBox *)GetDlgItem(IDC_COMBO_COM))->EnableWindow(FALSE);

    }

   else

    {

       k = ((CComboBox *)GetDlgItem((IDC_COMBO_COM)))->GetCount();

       ((CComboBox *)GetDlgItem(IDC_COMBO_COM))->SetCurSel(k - 1);

       //mCom.BindCommPort(num);

    }

}

 

 

 

//响应函数

void CENVVAR_CONFIGDlg::OnOnCommMscomm1()

{

         //TODO: Add your control notification handler code here

 

         VARIANTvariant_inp;

         COleSafeArraysafearray_inp;

         LONGlen,k;

         //BYTErxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.

         BYTErxdata[4096];

         CStringstrtemp;

 

         if(m_Comm1.GetCommEvent()==2)//事件值为2表示接收缓冲区内有字符

         {            

                   variant_inp=m_Comm1.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型变量

                   {

                            BYTEbt=*(char*)(rxdata+k); //字符型

                            strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放

                            m_EditRxData+=strtemp;//加入接收编辑框对应字符串

 

                   }

 

         }

        

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

 

         m_EditRxCtrl.LineScroll(m_EditRxCtrl.GetLineCount()-1,0);  //让显示到当前打印行

 

 

}

 

//打开串口:

void CENVVAR_CONFIGDlg::OnBtnOpen()

{

         //TODO: Add your control notification handler code here

         staticbool x=false;

         intcomport = 0;   

         intbaudrate = 0;  

         intcomportindex = 0;  

         //intbaudrateindex = 0;  

 

         CStringdata;

         inti;

         i= ((CComboBox *)GetDlgItem(IDC_COMBO_COM))->GetCurSel();

         ((CComboBox*)GetDlgItem(IDC_COMBO_COM))->GetLBText(i,data);

         data= data.Mid(3);

         i= atoi(data);

         comport= i;

 

         //comportindex= m_comport.GetCurSel();

         //comport= comportindex+1;   //序号加1 刚好为串口号

         //baudrate= 115200;

         if(!x)

         {

                   x= true;

                   GetDlgItem(IDC_BtnOpen)->SetWindowText("关闭串口");

 

                   if(m_Comm1.GetPortOpen())

                   {

                            m_Comm1.SetPortOpen(FALSE);

                   }

                  

 

                   m_Comm1.SetCommPort(comport);//选择com1,可根据具体情况更改

                   m_Comm1.SetInBufferSize(4096);//设置输入缓冲区的大小,Bytes

                   m_Comm1.SetOutBufferSize(4096);//设置输入缓冲区的大小,Bytes//

                   m_Comm1.SetSettings("115200,n,8,1");//波特率9600,无校验,8个数据位,1个停止位

                   m_Comm1.SetInputMode(1);//1:表示以二进制方式检取数据

                   m_Comm1.SetRThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

                   m_Comm1.SetInputLen(0);//设置当前接收区数据长度为0

                  

                   if(!m_Comm1.GetPortOpen())

                   {

                            m_Comm1.SetPortOpen(TRUE);//打开串口

                            AfxMessageBox("    串口打开成功!");

                   }

                   else

                   {

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

                            AfxMessageBox("    串口已打开!");

                   }

                  

         }

         else

         {

                   x=false;

 

                   GetDlgItem(IDC_BtnOpen)->SetWindowText("打开串口");

 

                   m_Comm1.SetPortOpen(FALSE);

                   AfxMessageBox("    串口已关闭!");

         }

 

        

         #if0

         if(m_Comm1.GetPortOpen())

         {

                   m_Comm1.SetPortOpen(FALSE);

         }

        

 

         m_Comm1.SetCommPort(comport);//选择com1,可根据具体情况更改

         m_Comm1.SetInBufferSize(1024);//设置输入缓冲区的大小,Bytes

         m_Comm1.SetOutBufferSize(1024);//设置输入缓冲区的大小,Bytes//

         m_Comm1.SetSettings("115200,n,8,1");//波特率9600,无校验,8个数据位,1个停止位

         m_Comm1.SetInputMode(1);//1:表示以二进制方式检取数据

         m_Comm1.SetRThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

         m_Comm1.SetInputLen(0);//设置当前接收区数据长度为0

        

         if(!m_Comm1.GetPortOpen())

         {

                   m_Comm1.SetPortOpen(TRUE);//打开串口

                   AfxMessageBox("openserial port success!");

         }

         else

         {

                  

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

                   AfxMessageBox("open serial port failed!");

 

 

         }

         #endif

        

         UpdateData(false);

        

}

 

 

//发送函数:

CString Dec_EnvVar[10];

CMSComm       m_Comm1;

m_Comm1.SetOutput(COleVariant(Dec_EnvVar[i]));

0 0