1.建立項目:
打開(kāi)VC++6.0,建立一個(gè)基于對話(huà)框的MFC應用程序SCommTest;
2.在項目中插入MSComm控件
選擇Project菜單下Add To Project子菜單中的 Components and Controls…選項,在彈出的對話(huà)框中雙擊Registered ActiveX Controls項(稍等一會(huì ),這個(gè)過(guò)程較慢),則所有注冊過(guò)的ActiveX控件出現在列表框中。 選擇Microsoft Communications Control, version 6.0,,單擊Insert按鈕將它插入到我們的Project中來(lái),接受缺省的選項。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安裝VC6時(shí)沒(méi)有把ActiveX一項選上,重新安裝VC6,選上ActiveX就可以了),
這時(shí)在ClassView視窗中就可以看到CMSComm類(lèi)了,(注意:此類(lèi)在ClassWizard中看不到,重構clw文件也一樣),并且在控件工具欄Controls中出現了電話(huà)圖標,現在要做的是用鼠標將此圖標拖到對話(huà)框中,程序運行后,這個(gè)圖標是看不到的。
3.利用ClassWizard定義CMSComm類(lèi)控制對象
打開(kāi)ClassWizard->Member Viariables選項卡,選擇CSCommTestDlg類(lèi),為IDC_MSCOMM1添加控制變量:m_ctrlComm,這時(shí)你可以看一看,在對話(huà)框頭文件中自動(dòng)加入了//{{AFX_INCLUDES() #include "mscomm.h" //}}AFX_INCLUDES 。
4.在對話(huà)框中添加控件 向主對話(huà)框中添加兩個(gè)編輯框,一個(gè)用于接收顯示數據ID為IDC_EDIT_RXDATA,另一個(gè)用于輸入發(fā)送數據,ID為IDC_EDIT_TXDATA,再添加一個(gè)按鈕,功能是按一次就把發(fā)送編輯框中的內容發(fā)送一次,將其ID設為IDC_BUTTON_MANUALSEND。別忘記了將接收編輯框的Properties->Styles中把Miltiline和Vertical Scroll屬性選上,發(fā)送編輯框若你想輸入多行文字,也可選上Miltiline。
再打開(kāi)ClassWizard->Member Viariables選項卡,選擇CSCommTestDlg類(lèi), 為IDC_EDIT_RXDATA添加CString變量m_strRXData, 為IDC_EDIT_TXDATA添加CString變量m_strTXData。說(shuō)明: m_strRXData和m_strTXData分別用來(lái)放入接收和發(fā)送的字符數據。
5.添加串口事件消息處理函數OnComm()
打開(kāi)ClassWizard->Message Maps,選擇類(lèi)CSCommTestDlg,選擇IDC_MSCOMM1,雙擊消息OnComm,將彈出的對話(huà)框中將函數名改為OnComm。
這個(gè)函數是用來(lái)處理串口消息事件的,如每當串口接收到數據,就會(huì )產(chǎn)生一個(gè)串口接收數據緩沖區中有字符的消息事件,我們剛才添加的函數就會(huì )執行,我們在OnComm()函數加入相應的處理代碼就能實(shí)現自已想要的功能了。請你在函數中加入如下代碼:
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表示接收緩沖區內有字符
{ ////////以下你可以根據自己的通信協(xié)議加入處理代碼
variant_inp=m_ctrlComm.GetInput(); //讀緩沖區
safearray_inp=variant_inp; //VARIANT型變量轉換為ColeSafeArray型變量
len="safearray"_inp.GetOneDimSize(); //得到有效數據長(cháng)度
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); //將字符送入臨時(shí)變量strtemp存放
m_strRXData+=strtemp; //加入接收編輯框對應字符串
}
}
UpdateData(FALSE); //更新編輯框內容
}
到目前為止還不能在接收編輯框中看到數據,因為我們還沒(méi)有打開(kāi)串口,但運行程序不應該有任何錯誤,不然,你肯定哪兒沒(méi)看仔細,因為我是打開(kāi)VC6對照著(zhù)做一步寫(xiě)一行的,運行試試。沒(méi)錯吧?那么做下一步:
6.打開(kāi)串口和設置串口參數
你可以在你需要的時(shí)候打開(kāi)串口,例如在程序中做一個(gè)開(kāi)始按鈕,在該按鈕的處理函數中打開(kāi)串口?,F在我們在主對話(huà)框的CSCommTestDlg::OnInitDialog()打開(kāi)串口,加入如下代碼:
// 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);//打開(kāi)串口
else
AfxMessageBox("cannot open serial port");
m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,無(wú)校驗,8個(gè)數據位,1個(gè)停止位
m_ctrlComm.SetInputModel(1); //1:表示以二進(jìn)制方式檢取數據
m_ctrlComm.SetRThreshold(1);
//參數1表示每當串口接收緩沖區中有多于或等于1個(gè)字符時(shí)將引發(fā)一個(gè)接收數據的OnComm事件
m_ctrlComm.SetInputLen(0); //設置當前接收區數據長(cháng)度為0
m_ctrlComm.GetInput();//先預讀緩沖區以清除殘留數據
現在你可以試試程序了,將串口線(xiàn)接好后(不會(huì )接?去看看我寫(xiě)的串口接線(xiàn)基本方法),打開(kāi)串口調試助手,并將串口設在com2,選上自動(dòng)發(fā)送,也可以等會(huì )手動(dòng)發(fā)送。再執行你編寫(xiě)的程序,接收框里應該有數據顯示了。
7.發(fā)送數據
先為發(fā)送按鈕添加一個(gè)單擊消息即BN_CLICKED處理函數,打開(kāi)ClassWizard->Message Maps,選擇類(lèi)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));//發(fā)送數據
}
運行程序,在發(fā)送編輯框中隨意輸入點(diǎn)什么,單擊發(fā)送按鈕,??!看看,在另一端的串口調試助手(或別的調試工具)接收框里出現了什么。
如果你真是初次涉獵串口編程,又一次成功,那該說(shuō)聲謝謝我了,因為我第一次做串口程序時(shí)可費勁了,那時(shí)網(wǎng)上的資料也不好找。開(kāi)開(kāi)玩笑,謝謝你的支持,有什么好東西別忘了給我寄一份。
說(shuō)明:
由于用到VC控件,在沒(méi)有安裝VC的計算機上運行時(shí)要從VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目錄下的System子目錄中(win2000為System32)并再進(jìn)行注冊設置。