1. 程式人生 > >串列埠學習筆記(一)

串列埠學習筆記(一)

一般來說要實現串列埠通訊,在32位模式下有以下4種方法:
1)、以檔案方式開啟串列埠
這裡使用Win32 API函式來實現,僅對32位Windows環境下的操作流程做一簡單介紹。以檔案方式對串列埠進行操作可以分成以下步驟:
i)應用CreateFile()來開啟串列埠
API函式CreateFile()定義如下:
HANDLE CreateFile(
LPCTSTR lpFileName ,//檔名,指定要開啟的串列埠邏輯名,用字串表示,如“COM1”
DWORD dwDesiredAccess,//訪問模式
DWORD dwShareMode,//共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes,//通常為NULL
DWORD dwCreatinonDistribution,//建立方式
DWORD dwFlagAndAttributes,//建立屬性和標誌
HANDLE hTemplateFile//臨時檔案的控制代碼,通常為NULL
);
dwShareMode:指定該埠的共享屬性。該引數是為那些由許多應用程式共享的檔案提供的。對於不能共享的串列埠,它必須置為0。這就是檔案與通訊裝置之間的主要差異之一。如果在當前的應用程式呼叫CreateFile()jf,另一個應用程式已經打開了串列埠,該函式就會返回錯誤程式碼,原因是兩個應用程式不能共享一個埠。然而,同一個應用程式的多個執行緒可以共享同CreateFile()返回的埠控制代碼,並且根據安全性屬性設定,該控制代碼可以被開啟埠的應用程式的子程式所繼承。
lpSecurityAttributes:引用安全屬性結構(SECURITY_ARRTIBUTES),該結構定義了一些屬性,例如通訊控制代碼如何被開啟埠的應用程式的子程式所繼承。將該引數設定為NULL將為該埠分配預設的安全性屬性。子應用程式所繼承的預設屬性是該埠中不能被繼承的。
dwCreatinonDistribution:指定如果CreateFile()正在被已有的檔案呼叫時應採取的動作。因為串列埠總是存在,dwCreatinonDistribution必須設定成OPEN_EXISTING。該標誌告訴Windows不要企圖建立新埠,而是開啟已經存在的埠。
dwFlagAndAttributes:描述了埠的各種屬性。對於檔案來說,有可能具有很多屬性,但對於串列埠,唯一有意義的設定是FILE_FLAG_OVERLAPPED。當建立時指定該設定,埠I/O可以在後臺進行(後臺I/O也叫非同步I/O)。FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED(重疊方式)。
hTemplateFile:指向模板檔案的控制代碼,當埠處於開啟狀態時,不使用該引數,因而必須置成0。
如果呼叫成功,那麼該函式返回檔案的控制代碼,如果呼叫失敗,則函式返回INVALID_HANDLE_VALUE。
一旦埠處於開啟狀態,就可以分配一個傳送緩衝區和接收緩衝區,並且通過呼叫SetupComm()實現其他初始化工作。也可以不呼叫SetupComm()函式,Windows系統也會分配預設的傳送和接收緩衝區,並且初始化埠。但為了保證緩衝區的大小與實際需要的一致,最好還是呼叫該函式。SetupComm()函式宣告如下:
BOOL SetupComm(
HANDLE hFile,//通訊裝置控制代碼
DWORD dwInQueue,//輸入緩衝區大小
DWORD dwOutQueue//輸出緩衝區大小
);
SetupComm()函式中各項含義說明如下:
hFile:由CreateFile()返回的指向已開啟埠的控制代碼。
dwInQueue和dwOutQueue:接收緩衝區的大小和傳送緩衝區的大小。這兩個定義並非是實際的緩衝區大小,指定的大小僅僅是“推薦的”大小,而Windows可以隨意分配任意大小的緩衝區。Windows裝置驅動程式可以獲得這兩個資料,並不直接分配大小,而使用來優化效能和避免緩衝區超限。
注意:當使用CreateFile()函式開啟串列埠時,為實現調變解調器的排它性訪問,共享標識必須設為零;建立標識必須設為OPEN_EXISTING;模板控制代碼必須置為空。

作者:blindpoint
主頁:www.blindpoint.net
注意:有任何問題到www.blindpoint.net/bbs論壇下進行諮詢探討先休息一下....(To Be Continue...)