VS2010基於對話方塊的MFC串列埠通訊簡明例程
本例程是在VS2010環境下,使用MFC做的是一個簡單的串列埠通訊程式。歡迎交流。
1.首先,在VS2010環境下建立基於對話方塊的MFC應用程式。
a.選擇選單項 檔案—>新建—>專案,彈出新建專案對話方塊。
b.左側面板中選擇Visual C++下的MFC,中間視窗中選擇MFC應用程式,然後在下面的名稱編輯框中鍵入工程名稱,本例取名SerialTest,在位置編輯框中設定工程的儲存路徑。點選確定。
c.在彈出的MFC應用程式嚮導中,點下一步到應用程式型別介面,在應用程式型別下選擇基於對話方塊,其他使用預設設定,點選完成。
2.接下來為對話方塊新增所需要的控制元件
a.在資源檢視
b.選中控制元件按Delete鍵刪除自動生成的靜態文字框TODO:在此放置對話方塊控制元件、按鈕控制元件確定和取消。
c.從右側工具箱中新增兩個Button按鈕,兩個Edit Control編輯框,一個StaticText靜態文字框和一個Combo Box組合框。(提示:在工具箱中滑鼠左鍵點下所需控制元件不放開,並拖到IDD_ADDITION_DIALOG對話方塊模板上,模板上會出現一個虛線框,我們找到合適的位置鬆開滑鼠左鍵放下它,即可成功新增所需控制元件)。d.適當改變控制元件大小,併合理佈局控制元件,使之如下圖所示(提示:1.用滑鼠左鍵選中控制元件後周圍出現虛線框,然後滑鼠移到虛線框上幾個黑點的位置會變成雙向箭頭的形狀,此時就可以按下滑鼠左鍵並拖動來改變控制元件大小了。當然,整個對話方塊模板也可以用這種方法改變大小。2.幾個控制元件的對齊等操作可按Ctrl鍵同時選中幾個控制元件,然後選擇軟體左上側工具條中的幾個按鈕進行操作)
e.更改控制元件屬性(選中控制元件,滑鼠移至右側屬性,即出現該控制元件的屬性面板):更改Button1的Caption為清除接收框、ID為IDC_BUTTON_CLEANUP;
Button2的Caption為傳送資料
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_strTXData和IDC_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。
分別在傳送資料的編輯框裡隨便輸入幾個字元,點選傳送資料
成功。