控件(CMSComm)進行串口編程

控件(CMSComm)進行串口編程  

2011-02-21 21:54:53|  分類: MFC / C++ |  標籤:串口   |字號 訂閱

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));//發送數據
}

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

如果你真是初次涉獵串口編程,又一次成功,那該說聲謝謝我了,因爲我第一次做串口程序時可費勁了,那時網上的資料也不好找。開開玩笑,謝謝你的支持,有什麼好東西別忘了給我寄一份。

最後說明一下,由於用到VC控件,在沒有安裝VC的計算機上運行時要從VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目錄下的System子目錄中(win2000爲System32)

 

COleVariant
  COleVariant類是對VARIANT結構的封裝。它的構造函數具有極爲強大的功能,當對象構造時首先調用VariantInit進行 初始化,然後根據參數中的標準類型調用相應的構造函數,並使用VariantCopy進行轉換賦值操作,當VARIANT對象不在有效範圍時,它的析構函 數就會被自動調用,由於析構函數調用了VariantClear,因而相應的內存就會被自動清除。除此之外,COleVariant的賦值操作符在與 VARIANT類型轉換中爲我們提供極大的方便


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/luheng2006/archive/2010/04/16/5491801.aspx


發佈了33 篇原創文章 · 獲贊 7 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章