用控制項(CMSComm)進行串口編程

來源:互聯網
上載者:User

1.建立項目  

2.在項目中插入MSComm控制項

3.利用ClassWizard定義CMSComm類控制變數

4.在對話方塊中添加控制項  

5.添加串口事件訊息處理函數OnComm()

6.開啟和設定串口參數

7.發送資料

 

 

開始吧:

1.建立項目:開啟VC++6.0,建立一個基於對話方塊的MFC應用程式SCommTest(與我原始碼一致,等會你會方便一點);

 

2.在項目中插入MSComm控制項    選擇Project菜單下Add To Project子功能表中的 Components and Controls…選項,在彈出的對話方塊中雙擊Registered ActiveX Controls項(稍等一會,這個過程較慢),則所有註冊過的ActiveX控制項出現在列表框中。 選擇Microsoft Communications Control, version 6.0,,單擊Insert按鈕將它插入到我們的Project中來,接受預設的選項。(如果你在控制項列表中看不到Microsoft
Communications Control, version 6.0,那可能是你在安裝VC6時沒有把ActiveX一項選上,重新安裝VC6,選上ActiveX就可以了),

這時在ClassView視窗中就可以看到CMSComm類了,(注意:此類在ClassWizard中看不到,重構clw檔案也一樣),並且在控制項工具欄Controls中出現了電話表徵圖(1所示),現在要做的是用滑鼠將此表徵圖拖到對話方塊中,程式運行後,這個表徵圖是看不到的。

 

3.利用ClassWizard定義CMSComm類控制對象   開啟ClassWizard->Member Viariables選項卡,選擇CSCommTestDlg類,為IDC_MSCOMM1添加控制變數:m_ctrlComm,這時你可以看一看,在對話方塊標頭檔中自動加入了//{{AFX_INCLUDES()   #include "mscomm.h"   //}}AFX_INCLUDES (這時運行程式,如果有錯,那就再從頭開始)。

 

4.在對話方塊中添加控制項   向主對話方塊中添加兩個編輯框,一個用於接收顯示資料ID為IDC_EDIT_RXDATA,另一個用於輸入發送資料,ID為IDC_EDIT_TXDATA,再添加一個按鈕,功能是按一次就把發送編輯框中的內容發送一次,將其ID設為IDC_BUTTON_MANUALSEND。別忘記了將接收編輯框的Properties->Styles中把Miltiline和Vertical Scroll屬性選上,發送編輯框若你想輸入多行文字,也可選上Miltiline。

再開啟ClassWizard->Member Viariables選項卡,選擇CSCommTestDlg類, 為IDC_EDIT_RXDATA添加CString變數m_strRXData, 為IDC_EDIT_TXDATA添加CString變數m_strTXData。說明: m_strRXData和m_strTXData分別用來放入接收和發送的字元資料。

       

5.添加串口事件訊息處理函數OnComm() 開啟ClassWizard->Message Maps,選擇類CSCommTestDlg,選擇IDC_MSCOMM1,雙擊訊息OnComm,將彈出的對話方塊中將函數名改為OnComm,(好記而已)OK。

這個函數是用來處理串口訊息事件的,如每當串口接收到資料,就會產生一個串口接收資料緩衝區中有字元的訊息事件,我們剛才添加的函數就會執行,我們在OnComm()函數加入相應的處理代碼就能實現自已想要的功能了。請你在函數中加入如下代碼:

void CSCommTestDlg::OnComm() 
{
     // TODO: Add your control notification handler code here
     VARIANT variant_inp;
     COleSafeArray safearray_inp;
     LONG len,k;
     BYTE rxdata[2048]; //設定BYTE數組 An 8-bit integerthat is not signed.
     CString strtemp;
     if(m_ctrlComm.GetCommEvent()==2) //事件值為2表示接收緩衝區內有字元
     {              ////////以下你可以根據自己的通訊協定加入處理代碼
         variant_inp=m_ctrlComm.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型變數
         {
             BYTE bt=*(char*)(rxdata+k); //字元型
             strtemp.Format("%c",bt); //將字元送入臨時變數strtemp存放
             m_strRXData+=strtemp; //加入接收編輯框對應字串 
         }
     }
     UpdateData(FALSE); //更新編輯框內容
}

到目前為止還不能在接收編輯框中看到資料,因為我們還沒有開啟串口,但運行程式不應該有任何錯誤,不然,你肯定哪兒沒看仔細,因為我是開啟VC6對照著做一步寫一行的,運行試試。沒錯吧?那麼做下一步:

 

6.開啟串口和設定串口參數   你可以在你需要的時候開啟串口,例如在程式中做一個開始按鈕,在該按鈕的處理函數中開啟串口。現在我們在主對話方塊的CSCommTestDlg::OnInitDialog()開啟串口,加入如下代碼:

// TODO: Add extra initialization here
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);

m_ctrlComm.SetCommPort(1); //選擇com1
if( !m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//開啟串口
else
AfxMessageBox("cannot open serial port");

m_ctrlComm.SetSettings("9600,n,8,1"); //傳輸速率9600,無校正,8個資料位元,1個停止位

m_ctrlComm.SetInputMode(1);   // 以二進位方式檢取資料
m_ctrlComm.SetRThreshold(1); 
//參數1表示每當串口接收緩衝區中有多於或等於1個字元時將引發一個接收資料的OnComm事件
m_ctrlComm.SetInputLen(0); //設定當前接收區資料長度為0
m_ctrlComm.GetInput();//先預讀緩衝區以清除殘留資料

 

現在你可以試試程式了,將串口線接好後,開啟串口調試助手,並將串口設在com2,選上自動發送,也可以等會手動發送。再執行你編寫的程式,接收框裡應該有資料顯示了。

7.發送資料   先為發送按鈕添加一個單擊訊息即BN_CLICKED處理函數,開啟ClassWizard->Message Maps,選擇類CSCommTestDlg,選擇IDC_BUTTON_MANUALSEND,雙擊BN_CLICKED添加OnButtonManualsend()函數,並在函數中添加如下代碼:

void CSCommTestDlg::OnButtonManualsend() 
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //讀取編輯框內容
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//發送資料
}

運行程式,在發送編輯框中隨意輸入焦點什麼,單擊發送按鈕,啊!看看,在另一端的串口調試助手(或別的調試工具)接收框裡出現了什麼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.