資源描述:
《利用vc中的通訊控件開發(fā)串形通信程序》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、利用VC中的通訊控件開發(fā)串形通信程序由于需要我們開發(fā)了前置機(jī)應(yīng)用程序,實(shí)現(xiàn)功能就是將前置機(jī)里存放的信息取出來用計(jì)算機(jī)進(jìn)行處理,該程序是利用VC在icrosoft5.0,利用Apptest,其中第二步選擇ActiveXControl選項(xiàng),證明支持控件功能,其他都選擇缺省,這樣就建立了一個(gè)基于對(duì)話框的應(yīng)用程序。然后將通訊控件加入應(yīng)用之中,在對(duì)話框資源上點(diǎn)擊鼠標(biāo)右鍵,選擇InsertActiveXControl然后在控件選擇對(duì)話框中選擇MicrosoftmunictionsControl,Version5.0,然后選擇Insert插入一個(gè)類似電話機(jī)的控件,然后點(diǎn)擊該控件就可以修改
2、和設(shè)置控件特性。按AddtoProject選項(xiàng)中RegisteredActiveXControl選項(xiàng)然后在控件選擇對(duì)話框中選擇MicrosoftmunictionsControl,Version5.0,將通訊控件兩個(gè)程序Msm.h和Msm.cpp加入project當(dāng)中。這樣就把通訊控件加入了應(yīng)用程序當(dāng)中,可以應(yīng)用該控件進(jìn)行編程了。2.通訊控件的各屬性的含義:事件,0表示不產(chǎn)生事件,1表示每接收一個(gè)字符就產(chǎn)生一個(gè)事件SThreshold0設(shè)定在觸發(fā)Onm事件前發(fā)送緩沖區(qū)內(nèi)所允許的最少字符數(shù),0表示發(fā)數(shù)據(jù)時(shí)不產(chǎn)生事件,1表示當(dāng)發(fā)送緩沖區(qū)空時(shí)產(chǎn)生Onm事件通訊控件的屬性很多,這里
3、只是介紹其中的幾種,可以根據(jù)自己的需求選擇加以設(shè)置調(diào)整,對(duì)于其他屬性可以查看VC幫助和聯(lián)機(jī)手冊(cè)。通訊控件的工作原理類似于中禵cf方式,當(dāng)有通訊事件發(fā)生時(shí)(如發(fā)送數(shù)據(jù)、接收數(shù)據(jù)等),就會(huì)觸發(fā)Onm事件,在該事件的處理函數(shù)中調(diào)用GetmEvent()函數(shù),通過返回值即可確定是那類事件,再作出相應(yīng)的處理。3.VC通訊控件的數(shù)據(jù)類型和命令對(duì)通訊控件來說,其所有的數(shù)綺dd類型和命令都在兩個(gè)控件文件msm.h和msm.cpp兩個(gè)文件當(dāng)中,msm.h定義了控件類和各條命令的函數(shù)及所用的各參數(shù),msm.cpp文件中有各命令函數(shù)的描述。4.主程序的編制在對(duì)話框中增加下面幾個(gè)按鈕:發(fā)送數(shù)據(jù)編輯
4、框發(fā)送數(shù)據(jù)按鈕;接收數(shù)據(jù)編輯框清除數(shù)據(jù)按鈕;通訊按鈕;首先我們?yōu)閷?duì)話框中的控件添加對(duì)應(yīng)的變量和響應(yīng)函數(shù)a3具體做法如下表所示。_SendDate發(fā)送按鈕IDC_SENDOnSend()清除按鈕IDC_CLEAROnClear()接收數(shù)據(jù)編輯框IDC_RECEiVEDATEm_RecEIveData通訊控件IDC_MSMm_m再打開ClassSM,可看到該控件能響應(yīng)的消息為Onm,添加改函數(shù)并將其改名為Onm(),在該函數(shù)中添加代碼,就能實(shí)現(xiàn)對(duì)串口事件的處理。其中一個(gè)需要注意的問題是函數(shù)GetInput()返回的是VARIANT型變量,而在編輯框中顯示的是Cstring型變
5、量,因此必須進(jìn)行轉(zhuǎn)換。先將VARIANT型變量轉(zhuǎn)換為ColeSafeArray型變量,再將其轉(zhuǎn)換為BYTE型數(shù)組,然后將數(shù)組轉(zhuǎn)換為Cstring型變量。這個(gè)轉(zhuǎn)換過程看起來比較復(fù)雜,但它可以滿足用不同的變量類型來顯示接收數(shù)據(jù)。該程序的主要代碼添加在mTestDlg.cpp中,如下所示:voidCmTestDlg::OnSend(){it(!m_m.GetPortOpen())m_m.SetPortOpen(TRUE);//打開串口UpdateData(TRUE);m_m.SetOutput(ColeVariant(m_SendData));//發(fā)送數(shù)據(jù)}voidCmTestD
6、lg::OnClear(){m_RecEiveData.Empty();//清除接收對(duì)話框中的數(shù)據(jù)m_SendData.Empty();//清除發(fā)送對(duì)話框中的數(shù)據(jù)UpdataData(FALSE);}voidCmTestDig::Onm(){VARIANTm_input1;ColeSafeArraym_input2;Longlength,i;BYTEdata[1024];Cstringstr;if(m_m.GetmEvent()==2)//接收緩沖區(qū)內(nèi)有字符{m_input1=m_m.Getinput();//讀取緩沖區(qū)內(nèi)的數(shù)據(jù)m_input2=m_input1;//將VA
7、RIANT型變量譥aa換為ColeSafeArray型變量length=m_input2.GetOneDimSize();//確定數(shù)據(jù)長(zhǎng)度for(i=0;im_input2.GetElement(i,data+i);//將數(shù)據(jù)轉(zhuǎn)換為BYTE型數(shù)組for(i=0;i{chara=*(char*)(data+i);str.Format(“%c”,a);m_RecEIveData+=str;}}UpdataData(FALSE);//更新編輯框內(nèi)容}5.試驗(yàn)程序現(xiàn)在程序已經(jīng)寫完,可以編輯訽cb行。我們可以做一個(gè)小實(shí)驗(yàn)來驗(yàn)