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個引數應增加fileflag
資料傳送
資料傳送利用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...