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