利用ActiveX控件開發(fā)串口通信軟件_第1頁
利用ActiveX控件開發(fā)串口通信軟件_第2頁
利用ActiveX控件開發(fā)串口通信軟件_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、、引言當我們在Windows操作系統(tǒng)下開發(fā)串行通信程序時通常不得不面對許多復雜的API函數,因為在Windows操作系統(tǒng)下不能直接對設備端口進行操作,也不能在系統(tǒng)級(Ring3級別)使用任何或BIOS中斷,如要對端口進行編程則只能以文件的形式來對端口進行操作,這就使開發(fā)人員不得不面對非常煩瑣的API函數編程。本文對此提出了另外一種圭寸裝性很好的使用MicrosoftVisual6.0自帶的MicrosoftCommunicationsControl,version6.0ActiveX控件的編程方法,通過對該控件的正確使用,我們可以比較輕松地編寫出所需的串行通信程序。下面,我們將結合一個實際的程

2、序示例來對此方法進行說明。本程序的編程環(huán)境是Windows98和MicrosoftVisual6.0。在本程序示例中對為避免阻塞而對線程的使用以及在使用中遇到的一些問題也做了詳細的介紹。二、程序的設計實現在開始進行代碼編程前,首先以在工程中插入組件或控件的方式將ActiveX控件MicrosoftCommunicationsControl,version6.0加入到工程中來,此時將會在工程中添加一個關于此控件的新類。使用該控件的一些方法和屬性時不能象使用類一樣簡單的聲明一個實例對象,而要通ClassWizard為該控件和一個成員變量建立起綁定關系,在此我們將該控件同變量m_Comm相綁定后就可

3、以通過該控件提供的方法來對串口的各種通訊參數進行設置了。為了編程方便起見,也可以在資源視圖中直接對該控件的屬性進行設置,如無特別要求,對下表所列屬性進行設置就基本可以滿足編程要求了?,F將常用的屬性列表如下:屬性設定值屬性說明CommPort1串口號,一般從1到4InBufferSize30720接收緩沖區(qū)大小,為保持程序的穩(wěn)定,建議設得值足夠大InputMode0-Text接收數據的類型,0表示文本類型,1表示二進制類型InputLen0從接收緩沖區(qū)讀取的字節(jié)數,0表示全部讀取OutBufferSize512發(fā)送緩沖區(qū)大小Settings4800,n,&1串口的參數設置,依次為波特率、奇偶校驗

4、(n-無校驗,e-偶校驗,o-奇校驗)、數據位數、停止位數RThreshold1設定當接收幾個字符時觸發(fā)OnComm事件,0表示不產生事件,1表示每接收一個字符就產生一個事件SThreshold0設定在觸發(fā)OnComm事件前,發(fā)送緩沖區(qū)內所允許的最少的字符數,0表示發(fā)送數據時不產生事件,1表示當發(fā)送緩沖區(qū)空時產生OnComm事件我們要求能在程序啟動的同時就打開串口以便即時對從串口到達的數據進行接收、處理。一般來說可以將下面的打開端口的代碼寫在OnCreate()、OnInitialUpdate()、InitInstance()等程序入口函數中:if(!m_Comm.GetPortOpen()/

5、檢測是否已經打開過端口m_Comm.SetPortOpen(TRUE);/如沒有打開則將端口打開接下來的工作就是對數據的發(fā)送與接收了,這也是本文所要介紹的重點所在。發(fā)送數據的代碼原則上是可以寫到一個成員函數中被直接調用的,但這并不是一個良好的編程習慣:我們應當把比較耗時的操作,如文件拷貝、打印、端口傳輸等工作放到一個單獨的線程當中,以避免其在工作時會引起整個進程的阻塞,以提高整個系統(tǒng)對CPU的利用率。例如我們可以在視類中菜單或按鈕的響應函數中用AfxBeginThread(WriteProc,this)函數來開啟一個名為WriteProc的線程,由于在線程中還需要使用視類的函數和變量,為了不產

6、生新的視類的實例對象,我們通過該函數的第二個參數將指向當前的視類的指針this作為參數傳遞給線程。在線程中可以用如下兩種方法之中的一種調用視類的成員函數:(COLECommView*)pParam)-DoSendProc();或是:COLECommView*view=(COLECommView*)pParam;View-DoSendProc();其中從pParam傳來的變量就是指向視類的指針。在線程中通過調用視類中的DoSendProc函數來完成對數據的發(fā)送,正是由于該函數是被全局的線程所調用的,我們就不可以使用取編輯框上的數據時通常所用的UpdateData函數了,取而帶之的是API函數Ge

7、tDlgItemText(),取到輸入的數據后通過控件的SetOutput()方法就把數據從串口發(fā)出去了,其中發(fā)送數據必須經ColeVariant類將其轉換為通用的VARIANT型變量。實現主要代碼如下:chara255;HWNDhwnd=GetSafeHwnd();:GetDlgItemText(hwnd,IDC_EDIT1,a,255);inti=0;CStringstr;while(ai!=0)str.Format(%c,ai);m_SendData+=str;i+;str.Format(%c,10);m_SendData+=str;m_Comm.SetOutput(COleVarian

8、t(m_SendData);至于數據的接收,我們可以通過讓MSComm控件響應其OnComm事件來完成,通過ClassWizard加入其對事件的響應后,通過下面的事件映射,當有字符到達時便會通知OnComm()函數去處理,從而實現數據的異步接收:BEGIN_EVENTSINK_MAP(COLECommView,CFormView)/AFX_EVENTSINK_MAP(COLECommView)ON_EVENT(COLECommView,IDC_MSCOMM1,1/*OnComm*/,OnComm,VTS_NONE)/AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()voi

9、dCOLECommView:OnComm()VARIANTInput;if(m_Comm.GetCommEvent()=2)接收緩沖區(qū)內有字符Input=m_Comm.GetInput();讀取緩沖區(qū)內的數據CStringmsg=Input.bstrVal;CStringstr;str.Format(%c,10);if(msg.Right(1)=str)m_RecvData+=msg;m_History.AddString(m_RecvData);m_RecvData=;elsem_RecvData+=msg;當數據被接收到接收緩沖區(qū)后,對于字符可以從VARIANT型結構變量的bstrVal成員變量中獲取,VARIANT數據結構相當復雜,并牽扯到COM(ComponentObjectModel,組件對象模型)中的一些概念,具體詳情請參閱MicrosoftCorpration發(fā)布的MSDN中的有關論述。三、測試與實驗編譯運行程序之前有必要對機器的端口做一番檢查,以確保端口的完好,可以用常見的程序Comdebug來檢查。在確認串口工作正常后,可用串口線將兩臺機器的串口相連,同時在兩臺機子上運行該程序,如果沒有條件也可只用一臺微機,將其串口的2腳和3腳短接,使其

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論