本文詳細(xì)介紹了Visual C++5.0版中有關(guān)通訊控件的使用方法,,并給出了一個(gè)利用該控件編寫的簡(jiǎn)單通用的通信示例程序,。 下面,我們將結(jié)合一個(gè)具體的例子來(lái)說(shuō)明,。本程序的編程環(huán)境是Win95和Visual C++5.0,。這個(gè)編程示例的功能比較強(qiáng),它可以由用戶選定進(jìn)行傳輸?shù)耐ㄐ哦丝?,并設(shè)定這個(gè)端口的相關(guān)參數(shù),,包括波特率、數(shù)據(jù)位,、停止位,、奇偶校驗(yàn)和流量控制等。還具有發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的雙重功能,。 一. 在程序中嵌入通訊控件 啟動(dòng)Visual C++5.0,,利用MFC AppWizard(exe)新建一個(gè)項(xiàng)目文件,并命名為CommTest,,在AppWizard第一步選擇基于對(duì)話框的應(yīng)用程序類型(Dialog based),,在第二步將ActiveX Controls復(fù)選框選中,表示本程序支持ActiveX控件。其他均接收缺省設(shè)置,,AppWizard將自動(dòng)生成一個(gè)以對(duì)話框?yàn)橹鞔翱诘膽?yīng)用程序,。下面我們將在該程序中加入通訊控件。在Resource View中打開對(duì)話框(IDD_COMMTEST_DIALOG),,將其修改為如圖一所示的對(duì)話框,。注意將對(duì)話框的語(yǔ)言屬性改為Chinese(P.R.C)。 單擊Project菜單,,從菜單中選擇Add to Project,,再單擊Components and Controls,從彈出的對(duì)話框中單擊Registered ActiveX Controls,,然后在列表框中選擇Microsoft Communications Control,,version 5.0,單擊OK,。這時(shí)會(huì)詢問(wèn)你是否加入CMSComm類,,單擊OK,返回后就會(huì)看到控件工具條上添加了一個(gè)通訊控件(形狀如電話機(jī)),,將其拖放到對(duì)話框上,,同時(shí)注意到Project中新增加了一個(gè)類。通過(guò)查看類MSComm的源文件mscomm.cpp,,我們可以了解這個(gè)控件的屬性和使用方法,,其中的Get…函數(shù)可以用來(lái)訪問(wèn)該屬性的當(dāng)前值,而Set…函數(shù)則用來(lái)設(shè)置該屬性的新值,。 二. 設(shè)置通訊控件的屬性值 激活通訊控件的屬性對(duì)話框,,一些重要的屬性及其說(shuō)明如表一所示: 屬 性 設(shè)定值 說(shuō) 明 CommPort 2 串口號(hào),一般串口為鼠標(biāo)所用,,故用串口2 InBufferSize 1024 接收緩沖區(qū)大小 InputLen 0 從接收緩沖區(qū)讀取的字節(jié)數(shù),,0表示全部讀取 InputMode 1 接收數(shù)據(jù)的類型,0表示文本類型,,1表示二進(jìn)制類型 OutBufferSize 1024 發(fā)送緩沖區(qū)大小 RThreshold 1 設(shè)定當(dāng)接收幾個(gè)字符時(shí)觸發(fā)OnComm事件,,0表示不產(chǎn)生事件,1表示每接收一個(gè)字符就產(chǎn)生一個(gè)事件 SThreshold 0 設(shè)定在觸發(fā)OnComm事件前,,發(fā)送緩沖區(qū)內(nèi)所允許的最少的字符數(shù),,0表示發(fā)送數(shù)據(jù)時(shí)不產(chǎn)生事件,1表示當(dāng)發(fā)送緩沖區(qū)空時(shí)產(chǎn)生OnComm事件 Settings 9600,n,8,1 串口的參數(shù)設(shè)置,依次為波特率,、奇偶校驗(yàn)(n-無(wú)校驗(yàn),e-偶校驗(yàn),o-奇校驗(yàn)),、數(shù)據(jù)位數(shù)、停止位數(shù) 表1 串口屬性及說(shuō)明 上面表中的屬性設(shè)定值是本例程中所用的值,,可根據(jù)需要靈活設(shè)定,。至于其它的屬性可采用缺省值,,其說(shuō)明可參考聯(lián)機(jī)幫助文件。 通訊控件的工作原理類似與中斷方式,,當(dāng)有通訊事件發(fā)生時(shí)(如發(fā)送數(shù)據(jù)、接收數(shù)據(jù)等),,就會(huì)觸發(fā)OnComm事件,,在該事件的處理函數(shù)中調(diào)用GetCommEvent()函數(shù),通過(guò)返回值即可確定是那類事件,,再做出相應(yīng)的處理,。 三. 主程序的編制 首先我們?yōu)閷?duì)話框中的控件添加對(duì)應(yīng)的變量和響應(yīng)函數(shù)。具體做法如表二所示: 控件名稱 控件ID 對(duì)應(yīng)變量或函數(shù) 發(fā)送數(shù)據(jù)編輯框 IDC_SENDDATA m_SendData 接收數(shù)據(jù)編輯框 IDC_RECEIVEDATA m_ ReceiveData 發(fā)送按鈕 IDC_SEND OnSend() 清除按鈕 IDC_CLEAR OnClear() 通訊控件 IDC_MSCOMM m_Comm 表2 添加控件表 再打開ClassWizard,,選中IDC_MSCOMM,,可看到該控件能響應(yīng)的消息為OnComm,添加改函數(shù)并將其改名為OnComm(),,在該函數(shù)中添加代碼,,就能實(shí)現(xiàn)對(duì)串口事件的處理。 其中一個(gè)需要注意的問(wèn)題是函數(shù)GetInput()返回的是VARIANT型變量,,而在編輯框中顯示的是CString型變量,,因此必需進(jìn)行轉(zhuǎn)換。先將VARIANT型變量轉(zhuǎn)換為COleSafeArray型變量,,再將其轉(zhuǎn)換為BYTE型數(shù)組,,然后將數(shù)組轉(zhuǎn)換為CString型變量。這個(gè)轉(zhuǎn)換過(guò)程看起來(lái)比較復(fù)雜,,但它可以滿足用不同的變量類型來(lái)顯示接收數(shù)據(jù),。該程序的主要代碼添加在CommTestDlg.cpp中,如下所示:void CCommTestDlg::OnSend() { if(!m_Comm.GetPortOpen()) m_Comm.SetPortOpen(TRUE);//打開串口 UpdateData(TRUE); m_Comm.SetOutput(COleVariant(m_SendData));//發(fā)送數(shù)據(jù) } void CCommTestDlg::OnClear() { m_ReceiveData.Empty();//清除接收對(duì)話框中的數(shù)據(jù) m_SendData.Empty();//清除發(fā)送對(duì)話框中的數(shù)據(jù) UpdateData(FALSE); } void CCommTestDlg::OnComm() { VARIANT m_Input1; COleSafeArray m_Input2; long length,i; BYTE data[1024]; CString str; if(m_Comm.GetCommEvent()==2)//接收緩沖區(qū)內(nèi)有字符 { m_Input1=m_Comm.GetInput();//讀取緩沖區(qū)內(nèi)的數(shù)據(jù) m_Input2=m_Input1;//將VARIANT型變量轉(zhuǎn)換為COleSafeArray型變量 length=m_Input2.GetOneDimSize();//確定數(shù)據(jù)長(zhǎng)度 for(i=0;i<length;i++) m_Input2.GetElement(&i,data+i);//將數(shù)據(jù)轉(zhuǎn)換為BYTE型數(shù)組 for(i=0;i<length;i++)//將數(shù)組轉(zhuǎn)換為CString型變量 { char a=*(char*)(data+i); str.Format("%c",a); m_ReceiveData+=str; } } UpdateData(FALSE);//更新編輯框內(nèi)容 } 四. 試驗(yàn)程序 現(xiàn)在程序已經(jīng)寫完,,可以編譯運(yùn)行,。我們可以做一個(gè)小實(shí)驗(yàn)來(lái)驗(yàn)證程序的功能。首先檢驗(yàn)?zāi)愕拇?,,看它是否工作正常,,可用常見的DOS程序Comdebug檢查。確認(rèn)串口工作正常后,,可用串口線將兩臺(tái)微機(jī)的串口2相連,,同時(shí)在兩臺(tái)機(jī)子上運(yùn)行該程序(也可只用一臺(tái)微機(jī),將其串口2的2腳和3腳短接,,即自發(fā)自收狀態(tài)),,在發(fā)送對(duì)話框中隨便敲入一些字符,用鼠標(biāo)點(diǎn)發(fā)送按鈕,,你就會(huì)在另一臺(tái)機(jī)子的接收對(duì)話框中看到這些數(shù)據(jù),,甚至漢字也可以發(fā)送,。由此可見,利用通訊控件可以很容易的編寫出串行通信程序,。但相對(duì)來(lái)說(shuō)通訊控件在VC中的使用要比在VB中復(fù)雜的多,,要想開發(fā)出更多更靈活的使用方法還需要不斷的摸索和實(shí)踐。 |
|