串列埠是常用的計算機與外部序列裝置之間的資料傳輸通道,由於序列通訊方便易行,所以應用廣泛。我們可以利用windows api 提供的通訊函式編寫出高可移植性的序列通訊程式。本例項介紹在visual c++6.0下如何利用win32 api 實現序列通訊程式。程式編譯執行後的介面效果如圖一所示:
圖一、串列埠通訊示例程式
一、實現方法
在win16中,可以利用opencomm()、closecomm()和writecomm()等函式開啟、關閉和讀寫串列埠。但在win32中,串列埠和其他通訊裝置均被作為檔案處理,串列埠的開啟、關閉和讀寫等操作所用的api函式與操作檔案的函式相同。可通過createfile()函式開啟串列埠;通過closefile()函式關閉串列埠;通過dcb結構、commprop()、getcommproperties()、setcommproperties()、getcommstate()及setcommstate()等函式設定串列埠狀態,通過函式readfile()和writfile()等函式讀寫串列埠。下面來詳細介紹其實現原理。
對於序列通訊裝置,win32 api支援同步和非同步兩種i/o操作。同步操作方式的程式設計相對比較簡單,但i/o操作函式在i/o操作結束前不能返回,這將掛起呼叫執行緒,直到i/o操作結束。非同步操作方式相對要複雜一些,但它可讓耗時的i/o操作在後台進行,不會掛起呼叫執行緒,這在大資料量通訊的情況下對改善呼叫執行緒的響應速度是相當有效的。非同步操作方式特別適合同時對多個序列裝置進行i/o操作和同時對乙個序列裝置進行讀/寫操作。
序列裝置的初始化
序列裝置的初始化是利用createfile()函式實現的。該函式獲得序列裝置控制代碼並對其進行通訊引數設定,包括設定輸出/接收緩衝區大小、超時控制和事件監視等。 例如下面的**實現了串列埠的初始化:
//序列裝置控制代碼;
handle hcomdev=0;
//串列埠開啟標誌;
bool bopen=false;
//執行緒同步事件控制代碼;
handle hevent=0;
dcb dcb;
commtimeouts timeouts;
//裝置已開啟
if(bopen) return false;
//開啟com1
if((hcomdev=createfile(「com1」,genericread|genericwrite,0,null,openexisting,fileattributenormal,null))==invalidhandlevalue)
return false;
//設定超時控制
setcommtimeouts(hcomdev,&timeouts);
//設定接收緩衝區和輸出緩衝區的大小
setupcomm(hcomdev,1024,512);
//獲取預設的dcb結構的值
getcommstate(hcomdev,&dcb);
//設定波特率為9600 bps
dcb.baudrate=cbr9600;
//設定無奇偶校驗
dcb.fparity=noparity;
//設定資料位為8
dcb.bytesize=8;
//設定乙個停止位
dcb.stopbits=onestopbit;
//監視串列埠的錯誤和接收到字元兩種事件
setcommmask(hcomdev,everr|evrxchar);
//設定序列裝置控制引數
setcommstate(hcomdev,&dcb);
//裝置已開啟
bopen=true;
//建立人工重設、未發訊號的事件
hevent=createevent(null,false,false,
「watchevent」);
//建立乙個事件監視執行緒來監視串列埠事件
afxbeginthread(commwatchproc,pparam); }
在設定串列埠dcb結構的引數時,不必設定每乙個值。首先讀出dcb預設的引數設定,然後只修改必要的引數,其他引數都取預設值。由於對串列埠進行的是同步i/o操作,所以除非指定進行監測的事件發生,否則waitcommevent()函式不會返回。在序列裝置初始化的最後要建立乙個單獨的監視執行緒來監視串列埠事件,以免掛起當前呼叫執行緒,其中pparam可以是乙個對事件進行處理的視窗類指標。
資料傳送
bool writecomm(lpcvoid lpsndbuffer,dword dwbytestowrite)
資料接收
接收資料的任務由readfile函式完成。該函式從串列埠接收緩衝區中讀取資料,讀取資料前,先用clearcommerror函式獲得接收緩衝區中的位元組數。接收資料時,同步和非同步讀取的差別同傳送資料是一樣的。
dword readcomm(lpvoid lpinbuffer,dword dwbytestoread)
事件監視執行緒
事件監視執行緒對串列埠事件進行監視,當監視的事件發生時,監視執行緒可將這個事件傳送(sendmessage)或登記(postmessage)到對事件進行處理的視窗類(由pparam指定)中。
uint commwatchproc(lpvoid pparam)
setevent(hevent);
//發訊號,指示監視執行緒結束
return 0; }
關閉序列裝置
在整個應用程式結束或不再使用序列裝置時,應將序列裝置關閉,包括取消事件監視,將裝置開啟標誌bopen置為false以使事件監視執行緒結束,清除傳送/接收緩衝區和關閉裝置控制代碼。
void closesyncomm()
二、程式設計步驟
1、 啟動visual c++6.0,生成乙個基於對話方塊的的應用程式,將該程式命名為「serealcom」;
2、 按照圖一的介面設計對話方塊,具體設定參見**部分;
3、 使用class wizard為對話方塊的按鈕新增滑鼠單擊訊息響應函式;
4、 新增**,編譯執行程式。
三、程式**
四、小結
以上給出了用win32 api設計序列通訊的基本思路,在實際應用中,我們可以利用win32 api設計出滿足各種需要的序列通訊程式。
用Win32 API實現序列通訊
2003 7 9 7 56 18 pcvc.wangxi 閱讀次數 30453 串列埠是常用的計算機與外部序列裝置之間的資料傳輸通道,由於序列通訊方便 易行,所以應用廣泛。我們可以利用windows api 提供的通訊函式編寫出高可移植性的 序列通訊程式。在win16中,可以利用open m clo...
VC 串列埠程式設計之基於Win32 API
1 api描述 在win32 api中,串列埠使用檔案方式進行訪問,其操作的api基本上與檔案操作的api一致。開啟串列埠 win32 中用於開啟串列埠的api 函式為createfile,其原型為 例如,以下程式用於以同步讀寫方式開啟串列埠com1 handle hcom dword dwerro...
用Win32 API建立不規則視窗
win32 api 支援建立不規則視窗,現在很多軟體使用這個技術,如 quicktime,windows media player 7等。a b使用api建立不規則視窗主要有兩種方式,即向量形狀疊加 布林運算 和點陣圖區域兩種。無論哪種方式,都可以實現上面兩圖的效果。在編寫這樣的視窗 前,我們必須清...