用Win32 API實現序列通訊

2021-03-31 08:57:01 字數 2574 閱讀 2025

2003-7-9 7:56:18   pcvc.***   wangxi   閱讀次數: 30453        串列埠是常用的計算機與外部序列裝置之間的資料傳輸通道,由於序列通訊方便

易行,所以應用廣泛。我們可以利用windows api 提供的通訊函式編寫出高可移植性的

序列通訊程式。

在win16中,可以利用open***m、close***m和write***m等函式開啟、關閉和

讀寫串列埠。但在win32中,串列埠和其他通訊裝置均被作為檔案處理,串列埠的開啟、關閉

和讀寫等操作所用的api函式與操作檔案的函式相同。可通過createfile函式開啟串列埠

,通過closefile函式關閉串列埠,通過***mprop、dcb結構、get***mproperties、

set***mproperties、get***mstate及set***mstate等函式設定串列埠狀態,通過函式

readfile和writfile讀寫串列埠。 

vc++ 6.0是windows應用程式開發的主流語言之一,它具有良好的圖形設計

介面並支援物件導向的程式設計方法。本文結合乙個例項介紹在vc++ 6.0下如何利用

win32 api 實現序列通訊程式。 

實現原理 

本文的例項來自乙個水泥發貨系統,在系統中,需要將通過總量感測器採集到

的倉重值傳入到計算機中,以便系統做出相應的處理。這需要使用序列通訊來完成採集

資料的傳遞工作。 

對於序列通訊裝置,win32 api支援同步和非同步兩種i/o操作。同步操作方式的

程式設計相對比較簡單,但i/o操作函式在i/o操作結束前不能返回,這將掛起呼叫執行緒

,直到i/o操作結束。非同步操作方式相對要複雜一些,但它可讓耗時的i/o操作在後台進

行,不會掛起呼叫執行緒,這在大資料量通訊的情況下對改善呼叫執行緒的響應速度是相當

有效的。非同步操作方式特別適合同時對多個序列裝置進行i/o操作和同時對乙個序列設

備進行讀/寫操作。這兩種操作方式的程式設計基本思想是相似的,本文將針對同步操

作方式給出具體的通訊程式設計,同時簡單說明如何實現非同步的i/o操作。 

序列裝置的初始化 

序列裝置的初始化是利用createfile函式實現的。該函式獲得序列裝置控制代碼並

對其進行通訊引數設定,包括設定輸出/接收緩衝區大小、超時控制和事件監視等。 

//序列裝置控制代碼; 

handle h***dev=0;  

//串列埠開啟標誌; 

bool bopen=false; 

//執行緒同步事件控制代碼; 

handle hevent=0;  

bool setupsyn***() 

在設定串列埠dcb結構的引數時,不必設定每乙個值。首先讀出dcb預設的引數設

置,然後只修改必要的引數,其他引數都取預設值。由於對串列埠進行的是同步i/o操作

,所以除非指定進行監測的事件發生,否則wait***mevent函式不會返回。在序列裝置

初始化的最後要建立乙個單獨的監視執行緒來監視串列埠事件,以免掛起當前呼叫執行緒,其

中pparam可以是乙個對事件進行處理的視窗類指標。 

如果要進行非同步i/o操作,開啟裝置控制代碼時,createfile的第6個引數應增加fileflag

資料傳送 

資料傳送利用writefile函式實現。對於同步i/o操作,它的最後乙個引數可為

bool write***m(lpcvoid lpsndbuffer,dword  

dwbytestowrite) 

資料接收 

接收資料的任務由readfile函式完成。該函式從串列埠接收緩衝區中讀取資料,

讀取資料前,先用clear***merror函式獲得接收緩衝區中的位元組數。接收資料時,同步

和非同步讀取的差別同傳送資料是一樣的。 

dword read***m(lpvoid lpinbuffer,dword  

dwbytestoread) 

事件監視執行緒 

事件監視執行緒對串列埠事件進行監視,當監視的事件發生時,監視執行緒可將這個

事件傳送(sendmessage)或登記(postmessage)到對事件進行處理的視窗類(由pparam指

定)中。 

uint ***mwatchproc(lpvoid pparam) 

setevent(hevent);  

//發訊號,指示監視執行緒結束 

return 0; 

} 關閉序列裝置 

在整個應用程式結束或不再使用序列裝置時,應將序列裝置關閉,包括取消事

件監視,將裝置開啟標誌bopen置為false以使事件監視執行緒結束,清除傳送/接收緩衝

區和關閉裝置控制代碼。 

void closesyn***m() 

小 結 

以上給出了用win32 api 設計序列通訊的基本思路,對這個同步i/o操作的串

行通訊程式稍加改造就可進行非同步i/o操作。在實際應用中,我們可以將這些序列通訊

函式和成員變數加到乙個已有的cwnd類或其派生類中來實現序列通訊,也可設計乙個新

的序列通訊類來包含這些成員函式和成員變數。總之,利用win32 api可以設計出滿足

各種需要的序列通訊程式。

VC 6 0中用Win32 API實現序列通訊

串列埠是常用的計算機與外部序列裝置之間的資料傳輸通道,由於序列通訊方便易行,所以應用廣泛。我們可以利用windows api 提供的通訊函式編寫出高可移植性的序列通訊程式。本例項介紹在visual c 6.0下如何利用win32 api 實現序列通訊程式。程式編譯執行後的介面效果如圖一所示 圖一 串...

基於Win32API的非同步串列埠通訊

只乙個框架性流程而矣.實現重疊模型的步驟 下面就結合俺寫的乙個console程式簡單示例進行說明 第一步 開啟串列埠 第二步 設定緩衝區大小 if setupcomm m hcom,2048,2048 protocoltype typedef enum packetdatatype 串列埠資料結構 ...

win32彙編使用win32 api實現字串拷貝

字串拷貝,呼叫win32的lstrcpy函式 拷貝了以後用訊息框顯示一下 386 model flat,stdcall option casemap none include s masm32 include windows.inc include s masm32 include user32.i...