多執行緒、重疊I/O的通訊埠元件 (轉)
大家都知道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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用Windows API和多執行緒進行串列埠通訊[1] (轉)WindowsAPI執行緒串列埠
- Java多執行緒-執行緒通訊Java執行緒
- java多執行緒5:執行緒間的通訊Java執行緒
- 徹底明白Java的多執行緒-執行緒間的通訊(2)(轉)Java執行緒
- 徹底明白Java的多執行緒-執行緒間的通訊(1)(轉)Java執行緒
- Java多執行緒學習——執行緒通訊Java執行緒
- 多執行緒之間的通訊執行緒
- java多執行緒間的通訊Java執行緒
- 執行緒通訊初探 (轉)執行緒
- 多執行緒之間通訊及執行緒池執行緒
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- JAVA - 基於Socket的多執行緒通訊Java執行緒
- Redis篇:單執行緒I/O模型Redis執行緒模型
- 程式通訊 執行緒通訊執行緒
- JavaThread多執行緒同步、鎖、通訊Javathread執行緒
- Java多執行緒-程式執行堆疊分析Java執行緒
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- 【Java】【多執行緒】兩個執行緒間的通訊、wait、notify、notifyAllJava執行緒AI
- 執行緒間的通訊執行緒
- MySQL 配置InnoDB主執行緒I/O速率MySql執行緒
- Java多執行緒/併發11、執行緒同步通訊:notify、waitJava執行緒AI
- 執行緒4--執行緒間通訊執行緒
- JavaSE_多執行緒入門 執行緒安全 死鎖 狀態 通訊 執行緒池Java執行緒
- Java執行緒通訊Java執行緒
- COM元件的多執行緒測試-Apartment模型 (轉)元件執行緒模型
- Java多執行緒中的wait/notify通訊模式Java執行緒AI模式
- java多執行緒:執行緒間通訊——生產者消費者模型Java執行緒模型
- MySQL 配置後臺InnoDB I/O執行緒數MySql執行緒
- 大話Android多執行緒(三) 執行緒間的通訊機制之HandlerAndroid執行緒
- 子執行緒與UI執行緒的通訊(委託)執行緒UI
- java socket 通訊socketServer 服務端多執行緒JavaServer服務端執行緒
- Android小知識-Java多執行緒相關(執行緒間通訊)上篇AndroidJava執行緒
- Java 多執行緒學習(執行緒通訊——消費者和生產者)Java執行緒
- Java多執行緒學習(五)執行緒間通訊知識點補充Java執行緒
- libuv執行緒通訊執行緒
- Java之執行緒通訊Java執行緒
- EventBus,輕鬆實現跨元件跨執行緒通訊元件執行緒