vs2013 串口收發例程講解:
- 創建MFC對話框,並布局好控件,后加入串口控件(在對話框上右鍵,選擇“insert ActiveX Control...”,之選擇“Microsoft Communications Control, version 6.0”控件)。

- 添加串口控件事件處理函數(右鍵串口控件,選擇"Add Event Handler"),同時添加串口成員變量,以及編輯框成員變量


- 同時雙擊兩個按鍵,添加兩個按鍵事件處理函數(一個處理串口打開,一個處理串口關閉)。
- 事件代碼如下:
- 開啟串口按鍵事件處理:
-
1 void CSerialComDlg::OnBnClickedButton1()//open 2 { 3 // TODO: Add your control notification handler code here 4 if (m_pcomm.get_PortOpen()) 5 { 6 m_pcomm.put_PortOpen(false); 7 } 8 m_pcomm.put_Settings(_T("9600,n,8,1")); 9 m_pcomm.put_InputMode(1); 10 m_pcomm.put_RThreshold(8); 11 m_pcomm.put_InputLen(0); 12 m_pcomm.put_PortOpen(true); 13 if (m_pcomm.get_PortOpen()) 14 { 15 GetDlgItem(IDC_BUTTON1)->ShowWindow(SW_HIDE); 16 GetDlgItem(IDC_BUTTON2)->ShowWindow(SW_SHOW); 17 } 18 else 19 { 20 AfxMessageBox(_T("Can not open serial port.")); 21 } 22 m_pcomm.get_Input(); 23 }
- 關閉串口按鍵事件處理:
1 void CSerialComDlg::OnBnClickedButton2()//close 2 { 3 // TODO: Add your control notification handler code here 4 if (m_pcomm.get_PortOpen()) 5 { 6 m_pcomm.put_PortOpen(false); 7 } 8 if (m_pcomm.get_PortOpen()) 9 { 10 AfxMessageBox(_T("Can not close serial port.")); 11 } 12 else 13 { 14 GetDlgItem(IDC_BUTTON2)->ShowWindow(SW_HIDE); 15 GetDlgItem(IDC_BUTTON1)->ShowWindow(SW_SHOW); 16 } 17 }
- 串口控件事件處理,用於處理串口事件
1 void CSerialComDlg::OnCommMscomm1() 2 { 3 VARIANT variant_inp; 4 COleSafeArray safearray_inp; 5 LONG len; 6 unsigned char rxdata[100]; 7 long i; 8 CString str(rxdata); 9 CString send = "C565A3D832045170CF2712239BADA944B39EB55E05063FA64F93CCB0440FA32E780B3CA947B3C8D0AB36DF1B4B"; 10 // TODO: Add your message handler code here 11 if (m_pcomm.get_CommEvent()==2) 12 { 13 variant_inp = m_pcomm.get_Input(); //get byte from input buffer 14 safearray_inp = variant_inp; //VARIANTD to COleSafeArray type 15 len = safearray_inp.GetOneDimSize(); //length of rx data 16 for (i = 0; i < len; i++) 17 { 18 safearray_inp.GetElement(&i, rxdata + i); 19 } 20 m_Edit1 = ""; 21 for ( i = 0; i < len; i++) 22 { 23 str.Format(_T("%X"), rxdata[i]); 24 if (strlen(str) == 0) 25 m_Edit1 += "00"; 26 else if (strlen(str) == 1) 27 { 28 m_Edit1 += "0"; 29 m_Edit1 += str; 30 } 31 else 32 m_Edit1 += str; 33 } 34 m_pcomm.put_Output(COleVariant(send)); 35 UpdateData(false); 36 } 37 }
- 因為我們將兩個按鍵疊加一起,當按下open按鍵,且串口打開正常時,顯示close按鍵,當按下close按鍵,且串口關閉正常時,顯示open按鍵。所以我們在啟動對話框的時候,需要先將close按鍵隱藏,而open按鍵顯示。因此我們需在對話框初始化時,添加代碼:
// Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here GetDlgItem(IDC_BUTTON2)->ShowWindow(SW_HIDE); return TRUE; // return TRUE unless you set the focus to a control
- 至此,我們的項目就完成了,但是,我們編譯的時候,可能會提示錯誤提示,因為我們調用了strlen函數,所以我們需要將項目設置一下
Use Multi-Byte Character Set

點擊運行,項目完成。
記錄編程路上的點點滴滴,你會發現代碼給我們的樂趣是那么的令人回味。
謝謝.
