20160426 VC++(VS2013)串列埠程式設計圖文教程(MSComm的使用)
阿新 • • 發佈:2019-02-03
1、新建MFC對話方塊工程如下
2、給編輯框控制元件新增變數,其中Edit Box新增Value變數,Button新增Control變數,ID和變數分別為:
IDC_BTNOPEN() CButton m_cBtnOpen;
IDC_BTNSEND() CButton m_cBtnSend;
IDC_EDIT_RXDATA() CString m_sRXDATA;
IDC_EDIT_TXDATA()
3、右擊插入Active X控制元件:
右擊電話圖示選擇“Class Wirzard”,新增變數m_comm1,新增Function:
雙擊兩個Button按鈕;
程式碼中顯示如下:
void CMSCommTestDlg::OnBnClickedBtnopen() { // TODO: Add your control notification handler code here } void CMSCommTestDlg::OnBnClickedBtnsend() { // TODO: Add your control notification handler code here } void CMSCommTestDlg::OnOncommMscomm1() { // TODO: Add your message handler code here }
5、將上面程式碼補全如下:
void CMSCommTestDlg::OnClickedBtnopen() { // TODO: Add your control notification handler code here //如果埠已經開啟,那麼先關閉 if (m_comm1.get_PortOpen()) { m_comm1.put_PortOpen(FALSE); } m_comm1.put_CommPort(3); //選擇com3,可以根據具體情況更改 m_comm1.put_InBufferSize(1024); //設定輸入緩衝區的大小,Bytes m_comm1.put_OutBufferSize(1024); //設定輸出緩衝區的大小,Bytes m_comm1.put_Settings(_T("9600,n,8,1")); //波特率9600,無校驗,8個數據位,停止位1 m_comm1.put_InputMode(1); //1:表示以二進位制方式檢索資料 m_comm1.put_RThreshold(1); //引數1表示每當串列埠接收緩衝區中有多於或等於1個字元時將引發一個接收資料的OnComm事件 m_comm1.put_InputLen(0); //設定當前接收區長度是0 if (!m_comm1.get_PortOpen()) { m_comm1.put_PortOpen(TRUE); } else { AfxMessageBox(_T("Can not open serial port!")); } m_comm1.get_Input(); //先預讀緩衝區以清除殘留資料 UpdateData(FALSE); } void CMSCommTestDlg::OnClickedBtnsend() { // TODO: Add your control notification handler code here UpdateData(TRUE); m_comm1.put_Output(COleVariant(m_sTXDATA));//傳送資料 } void CMSCommTestDlg::OnOncommMscomm1() { // TODO: Add your message handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len, k; BYTE rxdata[2048]; CString strtemp; if (m_comm1.get_CommEvent() == 2) //事件值為2表示緩衝區內有字元 { variant_inp = m_comm1.get_Input(); //讀緩衝區 safearray_inp = variant_inp; //VARIANT型變數轉換為ColeSafeArray型變數 len = safearray_inp.GetDim(); //得到有效資料長度 for (k = 0; k < len; k++) { safearray_inp.GetElement(&k, rxdata + k);//轉換為BYTE型陣列 } for (k = 0; k < len; k++) //將陣列轉換為CString型變數 { BYTE bt = *(char*)(rxdata + k); //字元型 strtemp.Format(_T("%c"), bt); //將字元送入臨時變數strtemp存放 m_sRXDATA += strtemp; //接收到的資料放到編輯框對應的變數中 } } SetDlgItemText(IDC_EDIT_RXDATA, m_sRXDATA); }
備註:
如果Project是基於檢視的,只需在對話方塊窗體中插入MSComm控制元件,再在檢視類的ClassWizard中為該控制元件宣告一個變數即可,如m_Comm1。