久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

VC++中用通訊控件開發(fā)串行通信程序

 浮 生 2008-12-05

本文詳細(xì)介紹了Visual C++5.0版中有關(guān)通訊控件的使用方法,,并給出了一個(gè)利用該控件編寫的簡(jiǎn)單通用的通信示例程序,。 

關(guān)鍵詞:串行通信       通訊控件 

    隨著Win 95的逐步普及,程序員們?cè)絹?lái)越愿意在Win95下編程,,而Visual C++正成為主要的開發(fā)工具,。然而用VC在Win95下開發(fā)串行通訊程序是程序員們經(jīng)常會(huì)遇到確又令人頭痛的一件事,不但要理解許多復(fù)雜的API函數(shù),,還要掌握多線程編程,。令人高興的是Visual C++中提供的通訊控件幫助我們解決了這一難題,通過(guò)對(duì)這一控件的正確使用,,我們可以輕松地編寫出所需的串行通信程序,。 

    下面,我們將結(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 



串口號(hào),一般串口為鼠標(biāo)所用,,故用串口2 

InBufferSize 

1024 

接收緩沖區(qū)大小 

InputLen 



從接收緩沖區(qū)讀取的字節(jié)數(shù),,0表示全部讀取 

InputMode 



接收數(shù)據(jù)的類型,0表示文本類型,,1表示二進(jìn)制類型 

OutBufferSize 

1024 

發(fā)送緩沖區(qū)大小 

RThreshold 



設(shè)定當(dāng)接收幾個(gè)字符時(shí)觸發(fā)OnComm事件,,0表示不產(chǎn)生事件,1表示每接收一個(gè)字符就產(chǎn)生一個(gè)事件 

SThreshold 



設(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í)踐。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多