使用winAPI 串列埠通訊 一

2021-04-14 20:36:37 字數 2752 閱讀 6041

串列埠和其他通訊裝置是作為檔案處理的.簡單的可以採用查詢方式(定時方式),複雜些的可以採用事件驅動的方式.   所謂驅動方式,即當有序列資料進入輸入緩衝區時,自動執行接受程式.

使用winapi來編寫 串列埠通訊程式時,讀寫操作可以有同步方式與重疊的非同步方式.所謂同步方式,就是當命令發出後,直到資料確實寫入到緩衝區後,寫函式才返回.這種方式操作簡單,但當資料寫入時間較長時,將會使程式掛起,降低程式的效率. 為了解決這種問題,引入非同步的重疊操作方式.在這種操作下,當執行完命令,不管寫入操作是否完成,寫函式馬上返回,寫操作在後台繼續進行,當寫操作完成後,通過某種方式通知呼叫寫操作的執行緒.這樣,就避免了主線程被掛起,提高了程式的效率.

一、採用同步查詢方式的程式設計方法

1.建立串列埠

(1) createfile()函式.

該函式是乙個通用的建立或開啟檔案的函式.在winapi程式設計中,它不僅可以操作檔案也可以操作串列埠.使用該函式可以開啟乙個串列埠,並返回乙個控制代碼,在程式中可以通過訪問該控制代碼來實現對串列埠的訪問.

handle     createfile (

lpctstr      lpfilename,    

dword      dwdesireaccess,

dword      dwsharemode,

lpsecurity_attributes      lpsecurityattributes,

dword       dwcreationdisposition,

dword       dwflagsandattributes,

handle      htemplatefile );

(2)setupcomm()函式

設定串列埠輸入緩衝區及輸出緩衝區的大小

bool     setupcomm  (

handle      hfile,

dword      dwinqueue,

dword      dwoutqueue );

(3) dcb資料結構

串列埠通訊中,使用該資料結構存放通訊引數.

由於該結構包括的通訊引數很多,逐個設定不方便.通常的做法是首先將串列埠的當前設定讀出到乙個dcb結構中,然後根據需要修改該dcb結構中的某些引數,再以該結構來設定串列埠通訊引數.

(4) setcommstate() 函式

要設定通訊引數,首先定義乙個dcb結構型別的變數. 根據通訊要求,設定該結構變數的數值.然後以該結構變數作為引數,執行該函式即可完成串列埠通訊引數的設定.

bool    setcommstate  (

handle     hfile,

lpdcb      lpdcb );

(5) getcommstate() 函式

該函式用來獲取當前串列埠通訊引數的設定數值.獲取的引數值存放到乙個dcb結構型別的變數中.

bool     getcommstate (

handle     hfile,

lpdcb      lpdcb

2. 關閉串列埠

關閉串列埠的操作很簡單,只需執行closehandle()函式即可.

bool    closehandle  (

handle   hobject );

3. 傳送資料

傳送資料使用writefile()函式

bool    writefile (

handle    hfile,

lpcvoid     lpbuffer,

dword     nnumberofbytestowrite,

lpdword     lpnumberofbyteswriten,

); 4. 接收資料

接收資料使用readfile()函式

bool    readfile (

handle    hfile,

lpcvoid     lpbuffer,

dword     nnumberofbytestoread,

lpdword     lpnumberofbytesread,

); 5. 定時接收資料的方法

要實現定時接收資料,需要使用定時器,然後將接收資料的操作放在定時器的響應事件函式中. 主要有以下幾步操作:

(1) 編寫定時器響應函式

定時器響應函式是全域性函式,不屬於任何類.直接在cpp檔案中書寫:

void  callback   timerproc (

hwnd    hwnd,      //啟動定時器的視窗控制代碼

uint    umsg,         //訊息的名稱.應該為wm_timer

uint    idevent,     //定時器識別符號.表明該**函式的定時器編號

dword     dwtime )    //當前系統時間

該函式是個**函式.當設定的定時器時間到達時,由系統自動呼叫.

(2) 啟動定時器

啟動定時器使用settimer()函式,該函式可以在程式的任何地方加入.

uint   settimer (

hwnd   hwnd,

uint     nidevent,

uint    uelapse,

timerproc     lptimerfunc );

(3) 關閉定時器

關閉定時器使用killertimer() 函式,任何地方加入.

bool    killtimer (

hwnd     hwnd,

uint    uidevent, );

使用winAPI串列埠通訊 二

採用同步方式的查詢方式讀取串列埠資料時,若由於串列埠操作耗費較長的時間,則程式會被掛起.為解決這種問題,可以在讀取資料時採用重疊i o操作.此時,讀寫資料的操作在單獨的執行緒中進行,發出讀寫要求的主線程可以繼續執行.當讀寫資料成功後,讀寫資料線程可以通過某種方式通知主線程.兩個執行緒協調工作,可以明...

使用winAPI串列埠通訊 二

採用同步方式的查詢方式讀取串列埠資料時,若由於串列埠操作耗費較長的時間,則程式會被掛起.為解決這種問題,可以在讀取資料時採用重疊i o操作.此時,讀寫資料的操作在單獨的執行緒 中進行,發出讀寫要求的主線程可以繼續執行.當讀寫資料成功後,讀寫資料線程可以通過某種方式通知主線程.兩個執行緒協調工作 可以...

串列埠通訊方法(WINAPI實現)

前言 程式實現 我在經過許多的專案的開發和實踐中發現,採用win api函式進行串列埠的開發能夠給程式設計師很大的控制項,並且程式運也很穩定。所以我將與串列埠接觸的函式進行封裝,然後在各個工程中進行呼叫,效果還是比較好的,現將各個函式和呼叫方法列舉出來,希望對各位有所幫助。一 設定串列埠相關工作 d...