?? lc_bcb_47.txt
字號:
用C++ Builder 4.0編寫Win 95下的串行異步通信程序
用C++Builder4.0編寫Win
95下的串行異步通信程序
姜濱
·串口操縱的基本方法·
在Win32下,對串口的操作就如同對文件一樣打開或關(guān)閉,對串行數(shù)據(jù)的讀寫可在用戶定義的讀寫緩沖區(qū)中進(jìn)行。具體使用的函數(shù)為:
首先用CreateFile( )打開通信串口,其中參數(shù)lpFileName指向串口邏輯名,如“COM1”或“COM2”等,參數(shù)dwDesiredAccess定義文件的讀寫權(quán)限,一般設(shè)為GENERIC—READ|GENERIC—WRITE;參數(shù)dwShareMode定義資源共享方式,此處必須設(shè)為0,為獨(dú)占方式;lpSecurityAttributes定義安全屬性,Win
95下為NULL;dwCreationDistribution定義文件創(chuàng)建方式;dwFlagsAndAttributes定義文件屬性和標(biāo)記,應(yīng)設(shè)為FILE—FLAG—OVERLAPPED,表示異步通信方式;hTemplateFile
指向一個模板文件的句柄,在 Windows 95下為NULL。
然后用BuildCommDCB( )和SetCommState( )函數(shù)通過通信設(shè)備控制塊DCB(Device
Control Block)設(shè)置串口通信參數(shù)(如波特率、停止位、數(shù)據(jù)位、校驗(yàn)位等),其中BuildCommDCB(
)中的字符串參數(shù)lpDef 定義同DOS命令中MODE的參數(shù)格式,關(guān)于DCB更具體的設(shè)置需要根據(jù)用戶對數(shù)據(jù)流定義、握手信號及通信控制要求具體定義,參見有關(guān)Windows技術(shù)資料。用GetCommState()可以得到當(dāng)前的DCB參數(shù)值。如果需要還可通過SetCommTimeouts()和GetCommTomeouts()重新設(shè)置讀寫的超時參數(shù);讀寫緩沖區(qū)的設(shè)置使用SetupComm(),參數(shù)dwInQueue和
dwOutQueue分別定義為輸入和輸出緩沖區(qū)的大小。
在串口初始化完畢后,還要建立與通信有關(guān)的事件對象。一般使用CreateEvent()函數(shù),它返回一事件句柄,其中參數(shù)lpEventAttributes指向安全屬性結(jié)構(gòu)地址,在Win
95(無安全屬性)中為NULL;布爾參數(shù)bManualReset 定義事件重置方式,true
表示手工重置,false表示自動重置(相關(guān)函數(shù)為SetEvent()和ResetEvent());參數(shù)bInitialState定義事件初始狀態(tài),true表示發(fā)信號,否則為不發(fā)信號;lpName是為多進(jìn)程設(shè)置的事件名,對于單進(jìn)程定義為NULL。然后用SetCommMask()定義用戶程序可監(jiān)視的通信事件類別。
以上設(shè)置完成后,用戶程序就可以等待通信事件的產(chǎn)生,一般調(diào)用函數(shù)WaitCommEvent()監(jiān)視通信事件,其中參數(shù)lpEvtMask指向產(chǎn)生事件的掩碼地址,用于判斷事件產(chǎn)生的性質(zhì),lpOverlapped指向重疊結(jié)構(gòu)地址,可簡單定義為NULL。對于串口事件的響應(yīng)一般有四種方式:查詢、同步I/O、異步I/O和事件驅(qū)動I/O,需要根據(jù)用戶不同控制要求而定。查詢方式占用較長的計(jì)算機(jī)時間,同步I/O方式直到讀取完指定的字節(jié)數(shù)或超時時才返回,容易造成線程阻塞,異步I/O用于后臺處理,事件驅(qū)動是由系統(tǒng)通知用戶程序發(fā)生的事件并進(jìn)行串口操作。
比較而言事件驅(qū)動I/O方式較靈活。
當(dāng)有通信事件產(chǎn)生時,就可用函數(shù)ReadFile()和WriteFile()直接對串口緩沖區(qū)進(jìn)行讀寫操作了。其中l(wèi)pBuffer
指向讀寫緩沖區(qū),nNumberOfBytes為要讀寫的字節(jié)數(shù),lpNumberOfBytes為實(shí)際讀寫的字節(jié)數(shù),lpOverlapped指定同步或異步操作。通信結(jié)束后,調(diào)用函數(shù)CloseHandle()將串口關(guān)閉。
·應(yīng)用實(shí)例說明·
使用以上的API函數(shù),筆者給出了簡化后的串口初始化的實(shí)例。圖1為使用C++
Builder 組件生成的串口通信基本參數(shù)設(shè)置的界面實(shí)例。
HANDLE hcom; //定義句柄
DCB dcb;
OVERLAPPED e; //定義重疊結(jié)構(gòu)
void —fastcall TForm1::OkBtnClick(TObject
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -