基於c++的串口通訊

利用vc++中的MSComm控件來進行串口的編程,方便快捷。

具體步驟:
1、在項目中插入MSComm控件
選擇Project菜單下Add To Project子菜單中的 Components and Controls選項,在彈出的對話框中雙擊Registered ActiveX Controls項。選擇Microsoft Communications Control,單擊Insert按鈕將它插入到我們的Project中來,這時在ClassView視窗中就可以看到CMSComm類了,並且在控件工具欄Controls中出現了電話圖標。
2、利用ClassWizard定義CMSComm類控制對象
打開ClassWizard->Member Viariables選項卡,選擇CSCommTestDlg類,爲IDC_MSCOMM1添加控制變量:m_ctrlComm。
3、在CSCommTestDlg::OnInitDialog( )函數中寫如串口初始化代碼
  1. BOOL CSCommTestDlg::OnInitDialog()  
  2. {  
  3. CDialog::OnInitDialog();  
  4.  
  5. 。。。  
  6.    
  7. if(m_ctrlComm.GetPortOpen())  
  8. m_ctrlComm.SetPortOpen(FALSE);  
  9. m_ctrlComm.SetCommPort(1); //選擇com1  
  10. if(!m_ctrlComm.GetPortOpen())  
  11. m_ctrlComm.SetPortOpen(TRUE);//打開串口  
  12. else 
  13. AfxMessageBox("cannot open serial port");  
  14. m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,無校驗,8個數據位,1個停止位  
  15. m_ctrlComm.SetInputMode(1); //1:表示以二進制方式檢取數據  
  16.  
  17. m_ctrlComm.SetRThreshold(1);  
  18. //參數1表示每當串口接收緩衝區中有多於或等於1個字符時將引發一個接收數據的OnComm事件
  19.  
  20. m_ctrlComm.SetInputLen(0); //設置當前接收區數據長度爲0  
  21. m_ctrlComm.GetInput();//先預讀緩衝區以清除殘留數據  
  22. return TRUE; // return TRUE unless you set the focus to a control  
  23. }
 4、添加串口事件處理函數OnComm( )
將控件拖至頁面中,對其添加消息函數,代碼如下:
  1. void CHDF_GUIDlg::OnOnCommMscomm1()   
  2. {  
  3.    
  4.     VARIANT variant_inp;  
  5.     COleSafeArray safearray_inp;  
  6.     static rxdata_len = 0;  
  7.     LONG len,k;  
  8.       
  9.     BYTE rxdata[500]; //設置BYTE數組 An 8-bit integerthat is not signed.  
  10.     CString strtemp;  
  11.       
  12.     if(m_ctrlComm.GetCommEvent()==2) //事件值爲2表示接收緩衝區內有字符  
  13.           
  14.     { ////////以下你可以根據自己的通信協議加入處理代碼  
  15.           
  16.         variant_inp=m_ctrlComm.GetInput(); //讀緩衝區     
  17.         safearray_inp=variant_inp; //VARIANT型變量轉換爲ColeSafeArray型變量  
  18.         len=safearray_inp.GetOneDimSize(); //得到有效數據長度  
  19.         for(k=0;k<len;k++)  
  20.             safearray_inp.GetElement(&k,rxdata+k+rxdata_len);//轉換爲BYTE型數組  
  21.         rxdata_len+=len;  
  22.         for(k=rxdata_len-len;k<rxdata_len;k++) //將數組轉換爲Cstring型變量         
  23.         {         
  24.             strtemp.Format("%.2x",rxdata[k]); //將字符送入臨時變量strtemp存放    
  25.             m_strRXData+=strtemp; //加入接收編輯框對應字符串      
  26.         }  
  27.         m_strRXData+="\r\n";      
  28.         UpdateData(FALSE); //更新編輯框內容  
  29.       
  30. //對數據進行處理,如果大於設定字符長度6,則先處理前6個字符再接着處理餘下字符
  31.         for(;rxdata_len>=6;)  //只要數據緩衝區數據大於6個字節,則進行一次處理
  32.         {  
  33.             if(0x58==rxdata[0]&&0x58!=rxdata[1]&&0x59==rxdata[5])//爲真表示爲數據開頭  
  34.             {  
  35.                 unsigned char ucdata[4]={rxdata[1],rxdata[2],rxdata[3],rxdata[4]};  
  36.                 for(k=0;k<rxdata_len-6;k++)  
  37.                 {  
  38.                     rxdata[k]=rxdata[k+6];  
  39.                 }  
  40.                 rxdata_len-=6;  
  41.                 ProcessData(ucdata);//對收到的一幀可用數據進行處理,更新各個狀態寄存器              }  
  42.             else 
  43.             {  
  44.                 for(k=0;k<rxdata_len-1;k++)  
  45.                 {  
  46.                     rxdata[k]=rxdata[k+1];  
  47.                 }  
  48.                 rxdata_len-=1;  
  49.             }  
  50.         }
  51.     }  

5.發送數據(爲發送按鈕添加函數)

爲發送按鈕添加一個單擊函數,既BN_CLICKED,打開建立類嚮導,選中IDC_BUTTON_MANUALSEND,雙擊BN_CLICKED添加OnButtonManualsend( )函數,代碼如下:

  1. void CSCommTestDlg::OnButtonManualsend()  
  2. {  
  3. // TODO: Add your control notification handler code here  
  4. UpdateData(TRUE); //讀取編輯框內容  
  5. m_ctrlComm.SetOutput(COleVariant(m_strTXData));//發送數據  
  6. }  

6.串口調試

下載運行VSPM虛擬串口v2.65,一切按默認進行,運行後COM3和COM4串口相連。將自己的vc程序改成控制串口COM3。運行串口調試助手v2.2,選擇串口COM4,調試串口之間的通信。

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