1. 程式人生 > >VS2010基於對話方塊的MFC串列埠通訊簡明例程

VS2010基於對話方塊的MFC串列埠通訊簡明例程

本例程是在VS2010環境下,使用MFC做的是一個簡單的串列埠通訊程式。歡迎交流。

1.首先,在VS2010環境下建立基於對話方塊的MFC應用程式。

a.選擇選單項 檔案—>新建—>專案,彈出新建專案對話方塊。

b.左側面板中選擇Visual C++下的MFC,中間視窗中選擇MFC應用程式,然後在下面的名稱編輯框中鍵入工程名稱,本例取名SerialTest,在位置編輯框中設定工程的儲存路徑。點選確定

c.在彈出的MFC應用程式嚮導中,點下一步應用程式型別介面,在應用程式型別下選擇基於對話方塊,其他使用預設設定,點選完成

2.接下來為對話方塊新增所需要的控制元件

a.在資源檢視

的資源樹中雙擊Dialog下的IDD_SERIALTEST_DIALOG,出現如下對話方塊編輯視窗(預設新建專案也是出現此介面,所以此步無需操作,僅作說明)


b.選中控制元件Delete鍵刪除自動生成的靜態文字框TODO:在此放置對話方塊控制元件、按鈕控制元件確定取消

c.從右側工具箱中新增兩個Button按鈕,兩個Edit Control編輯框,一個StaticText靜態文字框和一個Combo Box組合框。(提示:在工具箱中滑鼠左鍵點下所需控制元件不放開,並拖到IDD_ADDITION_DIALOG對話方塊模板上,模板上會出現一個虛線框,我們找到合適的位置鬆開滑鼠左鍵放下它,即可成功新增所需控制元件)。

d.適當改變控制元件大小,併合理佈局控制元件,使之如下圖所示(提示:1.用滑鼠左鍵選中控制元件後周圍出現虛線框,然後滑鼠移到虛線框上幾個黑點的位置會變成雙向箭頭的形狀,此時就可以按下滑鼠左鍵並拖動來改變控制元件大小了。當然,整個對話方塊模板也可以用這種方法改變大小。2.幾個控制元件的對齊等操作可按Ctrl鍵同時選中幾個控制元件,然後選擇軟體左上側工具條中的幾個按鈕進行操作)

e.更改控制元件屬性(選中控制元件,滑鼠移至右側屬性,即出現該控制元件的屬性面板):更改Button1Caption清除接收框、ID為IDC_BUTTON_CLEANUP Button2Caption傳送資料

IDIDC_BUTTON_SEND;下面的編輯框用於顯示傳送資料,ID設為IDC_EDIT_TXDATA; 下面的編輯框用於顯示接收到的資料,ID設為IDC_EDIT_RXDATA;靜態文字框的Caption選擇COM口:;ComboBox ID設為IDC_COMBO_COMType屬性設為DropList(即下拉列表式組合框,其編輯框是不能編輯的,只能由使用者在下拉列表框中選擇了某項後,在編輯框中顯示其文字)Sort屬性設為False,以取消自動排序顯示。

f.新增串列埠通訊控制元件。首先把串列埠通訊控制元件加入到工具箱中,因為預設的工具箱是不帶 MS 串列埠通訊控制元件的。方法如下:

工具箱介面點選滑鼠右鍵出現如下介面:


選擇選擇項出現如下介面,然後選擇COM元件屬性頁,勾選下圖所示項,點選確定。


這樣串列埠控制元件就已經新增至工具箱了,


將其拖入對話方塊裡,如圖所示(串列埠控制元件在執行時是看不到的)


至此控制元件新增基本上就完成了。

3.編寫訊息處理函式

a. 給Combo Box組合框新增列表項。選中ComboBox控制元件,右鍵->新增變數,設定變數名為m_comboCom,如圖所示,點選完成


在左側類檢視面板中,選擇CSerialTestDlg類,雙擊下方的OnInitDialog()函式進入CSerialTestDlg::OnInitDialog()函式


//TODO:此新增額外的初始化程式碼新增如下程式碼

// TODO: 在此新增額外的初始化程式碼
	m_comboCom.AddString(_T("COM1")); // 為組合框控制元件的列表框新增列表項
	m_comboCom.AddString(_T("COM2")); 
	m_comboCom.AddString(_T("COM3")); 
	m_comboCom.AddString(_T("COM4")); 
	m_comboCom.AddString(_T("COM5")); 
	m_comboCom.AddString(_T("COM6")); 
	m_comboCom.AddString(_T("COM7")); 
	m_comboCom.AddString(_T("COM8")); 
	m_comboCom.AddString(_T("COM9")); 
	m_comboCom.AddString(_T("COM10")); 

b.我們希望在組合框中選中的列表項改變時,以開啟相應串列埠並設定串列埠引數,那麼這就要用到CBN_SELCHANGE通知訊息。選中ComboBox右鍵->新增事件處理程式,出現如圖所示介面,點選新增編輯


CSerialTestDlg::OnCbnSelchangeComboCom()函式中新增程式碼之前我們需要給串列埠控制元件新增控制變數m_ctrlComm(方法見3.->a.),如圖


並在CSerialTestDlg中新增變數m_setOk(用於標記串列埠是否設定好),方法:在類檢視面板中選中CSerialTestDlg右鍵->新增->新增變數,


在彈出的介面中,選擇訪問private變數型別bool變數名m_setOk。這裡看到SerialTestDlg.h中已經添加了此變數,並在建構函式中已進行了初始化:



現在我們回到CSerialTestDlg::OnCbnSelchangeComboCom()中,新增如下程式碼:

void CSerialTestDlg::OnCbnSelchangeComboCom()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	int nSel;
	nSel = m_comboCom.GetCurSel();//獲取組合框控制元件的列表框中選中項的索引

	m_ctrlComm.put_CommPort(nSel+1);//選擇串列埠號(這裡因為列表框的索引號是從0開始,所以(nSel+1)對應的才是我們所選的串列埠號)
	m_ctrlComm.put_PortOpen(TRUE);//開啟串列埠
	m_ctrlComm.put_RThreshold(2);//收到兩個位元組引發OnComm事件	
	m_ctrlComm.put_InputMode(1);//輸入模式選為二進位制	
	m_ctrlComm.put_Settings(_T("9600,n,8,1"));//設定串列埠引數,波特率,無奇偶校驗,位停止位,位資料位
	m_ctrlComm.put_InputMode(1);  // 以二進位制方式檢取資料 
	m_ctrlComm.put_RThreshold(1); //引數1表示每當串列埠接收緩衝區中有多於或等於1個字元時將引發一個接收資料的OnComm事件 
	m_ctrlComm.put_InputLen(0); //設定當前接收區資料長度為0 
	m_ctrlComm.get_Input();//先預讀緩衝區以清除殘留資料  

	m_setOk = true;		//標記串列埠設定OK
}

c.新增串列埠事件訊息處理函式。在此步之前,我們先給IDC_EDIT_TXDATA編輯框新增CString變數m_strTXDataIDC_EDIT_TXDATA編輯框新增CString變數m_strRXData(方法見3.->a.,注意變數型別改為CString類別改為Value


然後我們新增串列埠訊息事件處理函式(方法見3.->b.),並將函式改名為OnComm


在CSerialTestDlg::OnComm()函式中新增如下程式碼:

void CSerialTestDlg::OnComm()
{
	// TODO: 在此處新增訊息處理程式程式碼
	VARIANT variant_inp;   //Variant 是一種特殊的資料型別,除了定長String資料及使用者定義型別外,可以包含任何種類的資料。
	COleSafeArray safearray_inp;     
	LONG len,k;    
	BYTE rxdata[2048]; //設定BYTE陣列 An 8-bit integer that is not signed.     
	CString strtemp;     
	if(m_ctrlComm.get_CommEvent() == 2) //事件值為2表示接收緩衝區內有字元     
	{            
		////////以下你可以根據自己的通訊協議加入處理程式碼 
		variant_inp=m_ctrlComm.get_Input();		//讀緩衝區  
		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(_T("%c"),bt); //將字元送入臨時變數strtemp存放   
			m_strRXData+=strtemp; //加入接收編輯框對應字串      
		}
	}     
	UpdateData(FALSE); //更新編輯框內容 
}

d.新增傳送資料按鈕的BN_CLICKED訊息的處理函式(方法見3.->b.),


在CSerialTestDlg::OnBnClickedButtonSend()中新增如下程式碼:

void CSerialTestDlg::OnBnClickedButtonSend()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	if (m_setOk == true)	//判斷是否開啟並初始化串列埠
	{
		UpdateData(TRUE);  //讀取編輯框內容
		m_ctrlComm.put_Output(COleVariant(m_strTXData)); //傳送資料
	} 
	else
	{
		MessageBox(_T("請先選擇COM口"));
	}
}

e.同理,新增清楚接收框按鈕的BN_CLICKED訊息的處理函式(方法見3.->b.),

CSerialTestDlg::OnBnClickedButtonCleanup()中新增如下程式碼:

void CSerialTestDlg::OnBnClickedButtonCleanup()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	m_strRXData="";
	UpdateData(FALSE);//更新編輯框內容 
}

4.生成可執行程式碼

a.點選啟動除錯按鈕或摁F5,編譯成功


b.點選選單欄生成->配置管理器


活動解決方案配置下拉選單中選擇Release,點選關閉


再次編譯,即可看到在目錄中生成了的Release資料夾下生成了.exe檔案。


5.檢測軟體是否能正常工作,

安裝完成後,開啟軟體


虛擬串列埠COM3和COM5:在右側埠一、二分別改為COM3和COM5,點選新增埠。


b.然後開啟兩個剛才生成的.exe檔案,分別選擇COM3和COM5。


分別在傳送資料的編輯框裡隨便輸入幾個字元,點選傳送資料


成功。