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就爲接受的數據
           }
      
     } 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章