WINDOWS95與NT下微機與智能化儀的串行通信設計
隨著計算機軟硬件的是......
隨著計算機軟硬件的是益發展,基于Windows95及NT平臺的軟件越來越多,在智能化電子儀表及計算機控制系統中都涉及到計算機與智能儀或
計算機之間進行信息交換,而串行通信是計算機之間以及計算機與單片機等數字化儀器通信的一種重要手段,是實現工業監控的一種主要方式
,由于它高效可靠,價格便宜,遵循統一的標準,因而得到廣泛應用。隨著計算機技術不斷發展,編程手段也不斷提高,如Visual Basic 、
Delphi 、Visual C++ 以及 C++ Builder等采用面向對象構件的方法,使得編寫Windows下的應用程序變得迅速和容易 ,其中Delphi功能強大,
代碼效率高,深受軟件開發人員睛睞, 但Delphi同Visual C++ 以及 C++ Builder一樣均未提供通信構件,為此用Delphi開發通信應用軟件時就
得應用API函數或Visual Basic的通信構件,API函數對一般開發人員有一定難度而且不太方便 ,而用VB 的通信構件開發的應用程序需在
WINDOWS95或NT中安裝并注刪相應的動態庫才能運行,這對應用用戶來說很不方便。為此本文介紹用API函數和多線程編程技術在Delphi3.0下設
計出自已的通信構件,并提供了全部源程序,利用Delphi安裝新構件方法將其安裝到自已的編譯系統中,就可以十分方便地開發出通信程序,
該構件在智能超聲液體成份分析儀及集散式網絡測控熱處理系統的被成功地應用。從中可以看出利用Delphi編制構件不斷豐富Delphi的內容的
本文有[www.0574-laser.com]提供,請及時關注[www.0574-laser.com]提供的內容
方法。
1 串行通信構件設計思想
一般基于DOS編程的程序員在編寫串行通信時,往往是編寫一個中斷服務程序,一旦串行口有數據它就會向CPU發出中斷請求,CPU在響應該
中斷后會執行串口的中斷服務程序,從而完成預定的任務。在Windows操作系統下,由于Windows禁止應用程序直接和硬件打交道,所以程序員
只能使用Windows提供的標準函數編程。雖然由于無需對硬件編程對有關硬件調試方便,但Windows本身遠比DOS復雜,所以對這些標準函數和
它們攜帶參數的理解和使用也遠比DOS困難,在Windows3.X中,當一個通信設備被打開并允許傳送WM-COMMNOTIFY消息時,只要該通信設備收到
數據,操作系統就會在消息隊列中置入WM-COMMNOTIFY消息,應用程序可以通過截獲操作系統發出的WM-COMMNOTIFY消息來對已打開的通信設備
進行操作。
在Windows95與NT中,修改了Windows3.X對串行口操作的標準函數,進行了更統一的規范化,取消了WM-COMMNOTIFY消息以及OpenComm,
CloseComm,ReadComm,WriteComm,FlushComm等函數,對待串行口操作如同文件一樣,其串行設備的打開和關閉操作使用與文件打開與關閉
操作相同的函數,如CreatFile,CloseFile,ReadFile,WriteFile,PurgeComm等,由于Windows95與NT中允許用戶定義大小的讀寫緩沖區,這
樣數據丟失可能性很小,同時使得讀寫速度很快。在Windows95與NT中支持多線程編程技術,而Delphi3.0為多線程編程和編制構件提供了支持
,這樣就可以編制串行通信構件了,即建立新的“.pak”文件就行了。
考慮到篇幅,在這個構件中只提供必要且夠一般常用的幾個屬性和當輸入緩沖有數據時而產生的事件,這些屬性中可視屬性為波特率、數
據位、效驗位、停止位、串行口名、輸入緩沖大小(即讀緩沖)、輸出緩沖大小(即寫緩沖)、觸發事件方式;運行屬性有串口設備句柄、消
本文有[www.0574-laser.com]提供,請及時關注[www.0574-laser.com]提供的內容
息窗句柄、事件句柄;運行中的方法有端口打開和端口關閉函數。
構件的設計思想是:可視屬性中的數據位、效驗位、停止位、觸發事件方式用梅舉類型定義,編程人員將方便地選擇所需的值就行了,可
視屬性中波特率、串行口名、輸入緩沖大小、輸出緩沖大小由編程人員輸入設定;觸發事件方式有每收一字符觸發和一隊列收到后觸發。在構
件的創建過程中將可視屬性賦缺省值,當程序運行構件的端口打開函數(ComPortOpen )時,將串口按構件可視屬性設定值進行端口初始化及
創建監視串口線程并返回端口句柄(hCommFile);監視線程的作用是,按觸發事件方式監視串口,當串口有數據時就向窗函數發出自定義的
WM_COMMNOTIFY消息,窗函數收到WM_COMMNOTIFY消息后觸發OnComm事件;當執行端口關閉函數(comPortClose)時,該函數關閉端口并撤消監
視線程。程序流程圖為圖1。
圖 1
2 應用說明
當執行ComPortOpen函數(即方法)時,用CreatFile()打開串行口,此時fdwShareMode,參數必須是零,打開獨占訪問的資源。FdwCreate
參數必須是指定的OPEN_EXISTING標志,hTemplateFile參數必須是Nil,用GetCommState設置通信參數,用CreateEvent()創建事件對象,用
AllocateHWnd()得到窗口數構柄;利用Delphi3.0創建多線工具建立一個監視線程的對象TmyCommWacth;在監視線程中用ResetEVent()設置事
件句柄,用WaitForSingleObject()指定對象處于信號或超時狀態時返回,用PostMessage()向指定窗發送消息; 窗函數收到消息后用
ClearCommError()清除錯誤,用自定的過程 OnCommData(PChar(msg.LParam), msg.WParam )觸發事件OnComm,當執行端口關閉函數
comPortClose時 ,用CloseMyComThread撤消監視線程,用DeallocateHWnd()釋放消息窗句柄,用 CloseHandle()關閉事件和串口;用
RegisterComponents 對構件進行注冊。考慮到篇幅源程序未提供讀寫緩沖數據程序,實際上接收數據可在OnComm事件中用ReadFile()讀,其
文件句柄為ComPortOpen返回的串口設備句柄hCommFile;寫數據可編一過程或函數用WriteFile(),其文件句柄同讀句柄,讀寫數據比較簡單