多執行緒、重疊I/O的通訊埠元件 (轉)

worldblog發表於2007-12-11
多執行緒、重疊I/O的通訊埠元件 (轉)[@more@]

 

大家都知道MS 提供了MMM.OCX,用於透過COM封裝對通訊埠的訪問。本人的一個朋友要求用串列埠實行實時資料採集,同時又要把採集的資料實時繪圖。用MSCOMM實現效果很不理想。本人編寫了這個元件--LiteSerial.dll,一個輕型的控制通訊埠的COM。用 Visual C++ 6.0的ATL 3.0開發。它實現了這樣的效果:串列埠9600bps下,傳送端不間斷地在2秒內傳送2048位元組(這是在9600bps所能達到的最度),接收端設為非同步接收方式,在前臺畫圖的條件下,後臺可以一個不漏地在標準時間內(2秒)接收全部資料,而且前臺的操作沒有明顯中斷,測試時整體用時不超過3秒,取決於前臺工作的強度。後來本人把這個元件進一步完善,形成了一個接近MSCOMM的、功能比較齊全的通訊埠控制介面。由於它側重於以最少的資源解決實時快速讀取串並口等通訊資源,沒有加入對Modem進行控制的功能,可以利用元件聚合(Aggregation)技術或直接介面繼承實現。這個元件是透過總結很多網上資料編寫出來的,因此奉獻出來,供大家探討交流。
元件的ILiteSerialPort介面,封裝了對串列埠、並口等可以用 CreateFile開啟的標準通訊資源(Communication Re)的同步、非同步讀寫。元件對串列埠的訪問一律採用Win32重疊I/O (Overlapped I/O)技術。非同步讀寫時,採用多執行緒和類似producer/consumer的迴圈緩衝區控制實現併發讀寫。整體比MSCOMM.OCX實時性好,佔用資源少。可以最大限度地利用通訊速率,滿足極端條件下的資料採集要求。
隨文件提供了元件LiteSerial.dll及其,幫助LiteSerial.chm,VC客戶端例子sin.exe及其原始碼,VB客戶端例子vbcomtest.exe及其原始碼。

以下檔案的BBS檔案標題:LiteSerial的相關檔案,關鍵字:LiteSerialFiles:
LiteSerial.zip-LiteSerial.dll
LiteSerialSource.z- LiteSerial原始碼,ATL工程。注意LiteSerial.dll是編譯成Win32 Release MinDependency,這樣得到的元件尺寸小而且不需要額外的atl.dll。但是LiteSerial.dll不能存放在含非ANSI字元的資料夾中,否則無法註冊,這是ATL中的。
Sin.- sin.exe及其原始碼
Vbcomtest - vbcomtest.exe及其原始碼


LiteSerial.chm - HTMLHelp格式的幫助文件,由於我不知道CSDN上不允許傳送除ZIP外的檔案,第一次與前幾個檔案傳送時失敗,所以此檔案另向BBS發一檔案,標題為:LiteSerial的幫助檔案,關鍵字:LiteSerialHelp。
使用前請詳細閱讀LiteSerial.chm幫助檔案。

原幫助檔案有點不準確的地方:
“VC客戶端例子”頁中,在
AfxGetApp()->m_pMainWnd->PostMessage(WM_COMMAND,ID_COMM_GETDATA); 
後面的一段,應改為:

“我沒有直接用AfxGetMainWnd獲得主視窗控制程式碼,因為主視窗是屬於主執行緒的,但這時不是處在主執行緒中,而AfxGetMainWnd可能是從當前執行緒查詢主視窗的。因此,我特地用了AfxGetApp()先取得主執行緒,再透過CWinThread的類成員m_pMainWnd獲得主視窗。 ”

為此,又了一次新版的幫助檔案,請按“LiteSerial的幫助檔案”的第二個連結。


此元件及其原始碼可以隨意使用或引用,只是不允許他人將此元件及其原始碼作為其個人成果發表。作者希望能得到對它的評價和意見,同時希望如果有人修改了原始碼,能及時得到通知和修改的內容。歡迎大家的批評和改進。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991454/,如需轉載,請註明出處,否則將追究法律責任。

相關文章