激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

深入Windows通信編程

時(shí)間:2024-07-12 04:17:51 計算機畢業(yè)論文 我要投稿
  • 相關(guān)推薦

深入Windows通信編程

一、Windows通信機制
Windows與DOS編程的重要差別在于Windows程序是消息驅動(dòng)和設備統一管理。體現在通信方面,DOS中的寄存器直接讀寫(xiě)、BIOS調用和通信中斷程序等編程方法都不能或不宜采用。Windows通過(guò)通信驅動(dòng)程序COMM.DRV與硬件接口,向程序員提供了多達17個(gè)標準函數,功能強大,但也增加了理解和編程的難度。
Windows3.1通信函數主要有:
OpenComm
打開(kāi)一通信設備
BuildCimmDCB將一設備定義字符串轉變?yōu)镈CB數據結構
EnableCommNotification使能或禁止傳送WM_COMMNOTIFY消

SetCommState設置通信設備狀態(tài)
SetCommEventMask設置通信事件掩碼
ReadComm從通信設備讀字符
WriteComm向通信設備寫(xiě)字符
FlushComm清除一發(fā)送或接收隊列
GetCommEventMask返回通信事件掩碼
GetCommState返回設備控制塊(DCB)
GetCommError恢復通信設備狀態(tài)
CloseComm關(guān)閉一通信設備
DCB數據結構、其它通信函數及各函數的具體用法請參見(jiàn)有關(guān)資料。
一般Windows通信編程應包括兩部分:設備初始化及WM_COMMNOTIF
Y消息處理。
設備初始化典型流程如圖1。
圖1
WM_COMMNOTIFY消息處理典型流程如圖2。
圖2
對于大多數實(shí)際通信來(lái)說(shuō),可能只需要處理流程圖中的一部分。
設備初始化及WM_COMMNOTIFY消息處理兩部分密切相關(guān)。所有類(lèi)型WM_COMMNOTIFY消息的傳送都是因為在初始化函數中進(jìn)行了相應的設置。
換言之,可以根據通信的實(shí)際情況有選擇地設置,控制Windows向應用程序發(fā)送的WM_COMMNOTIFY消息的數量和類(lèi)型,以期達到高效、可靠的通信。例如,對于固定長(cháng)度消息型的通信可以在EnableCommNotification函數中設置cbWriteNotify和cbOutQueue參數為消息長(cháng)度;對于以固定字符結尾的消息型通信可以在事件掩碼中包括EV_RXFLAG,將DCB數據結構中的EvtChar變量置為結尾字符,然后調用SetCommState和SetCommEventMask函數;對于遵循V.25bis之類(lèi)協(xié)議的通信,由于用到了大量信號線(xiàn)來(lái)作握手信號,則事件掩碼中要包含EV_CTS、EV_DSR、EV_RSLD及EV_RING等;而對于文件傳送型的通信,則宜將OpenComm函數中的cbInQue和cbOutQue變量、EnablecCommNotification中的cbWriteNotify和cbOutQueue變量設置為較大值,以加快文件傳送速度。

二、Windows通信疑難探討
現將筆者在實(shí)際編程中遇到的疑難和解決辦法描述如下,希望對遇到類(lèi)似問(wèn)題的朋友有所啟發(fā)。

1.怎樣用Windows未提供的波特率通信?
Windows提供了由110bps至256000bps共十三種波特率,一般情況下已足夠使用。但在某種特定情況下,例如通信對方使用150bps、又無(wú)法要求對方改變波特率時(shí),Windows通信就比較困難了。
首先想到的解決方法是直接調用BIOS中斷14H來(lái)設置波特率(DOS提供了150bps的波特率)。結果是Windows屏蔽了該中斷,嘗試失敗。
最后的是采用"蒙混過(guò)關(guān)"的辦法解決問(wèn)題的:首先,以任一Windows支持的波特率(例如300bps)構造通信參數字符串,調用BuildCommDCB產(chǎn)生DCB數據結構;然后調用SetCommState設置通信參數;最后再調用自編函數直接修改串口通信寄存器的值。經(jīng)實(shí)驗,設置成功,且對Windows程序運行無(wú)任何不良影響。

2.接收數據為何"丟失"?
通過(guò)設置EnableCommNotification函數中的cbWriteNotify參數(在發(fā)送WM_COMMNOTIFY消息之前,通信設備驅動(dòng)程序必須向應用程序出入隊列中寫(xiě)入的字節數),可以使系統每收到固定個(gè)字符發(fā)出一WM_COMMNOTIFY消息,這對于固定長(cháng)度消息型的通信是很方便的。但實(shí)際應用時(shí)有時(shí)會(huì )發(fā)生接收數據"丟失"現象,即收到WM_COMMNOTIFY消息后從接收隊列讀出cbNotify個(gè)數據時(shí),發(fā)現只有前面部分數據正確。
經(jīng)檢查,"丟失"現象是由于接收數據超時(shí)引起的,當通信對方時(shí)鐘頻率較低時(shí),規定時(shí)間內收不到cbWriteNotify指定的數據量,即所謂"超時(shí)",Windows照樣向應用程序發(fā)送帶CN_RECEIVE標志的WM_COMMNOTI
FY消息。然后,在應用程序輸入隊列數據讀出之前,Windows不再發(fā)送該類(lèi)消息。
解決的方法是減小cbWriteNotify的設定值直到不再發(fā)生"超時(shí)"現象。
發(fā)送數據時(shí)同樣應正確設定cbOutQue值,以免產(chǎn)生"超時(shí)"現象。
如果將cbWriteNotify或cbOutQue設為-1,則Windows不傳送帶CN_RECEIVE或CN_TRANSMIT標志的WM_COMMNOTIFY消息。

3.怎樣合理使用FlushComm與GetCommError函數?
FlushComm函數的功能是清除指定設備接收或發(fā)送隊列。GetCommError函數的功能是返回指定設備最近錯誤碼和當前狀態(tài),更重要的是"解鎖"功能:當出現通信錯誤時(shí),Windows會(huì )鎖死通信端口直到調用GetCommError。
調用FlushComm的時(shí)機很重要,如果通信端口發(fā)生錯誤,不調用該函數就有可能會(huì )使接收隊列包含不期望的數據;若隨便調用該函數,也有可能造成尚未讀入或發(fā)出的數據丟失?傊,調用該函數要做到"心中有數"。
為了合理調用FlushComm和GetCommError函數,建議在事件掩碼中包含EV_ERR與EV_BREAK。

4.Windows多串口通信
Windows最多可支持四個(gè)串口的通信,但對于ISA總線(xiàn)的PC,由于其COM1與COM3、COM2與COM4分別共用IRQ3和IRQ4,所以只能同時(shí)使用兩個(gè)串口。MCA、EISA總線(xiàn)系統沒(méi)有此限制。
如果需要使用的端口不止四個(gè),可以在PC護展槽中加插多用戶(hù)卡,如美國的Comtrol、臺灣的Moxa(摩莎)等,就可以支持幾個(gè)到幾十個(gè)串口,加上隨卡提供的Windows驅動(dòng)程序,就可以進(jìn)行多串口通信。具體用法請參閱擴展卡說(shuō)明書(shū)。

三、Windows通信實(shí)例
實(shí)例的通信環(huán)境為:本方COMPAQ 4/5

【深入Windows通信編程】相關(guān)文章:

Windows 2000系統編程-進(jìn)程的創(chuàng )建12-04

長(cháng)距離通信器S1503的應用編程原理03-18

用Borland C 3.1實(shí)現外設與Windows應用程序實(shí)時(shí)通信03-21

在Windows2000下用多線(xiàn)程實(shí)現1394串行總線(xiàn)通信03-20

探索結對編程03-04

Windows 中斷程序設計03-28

在 DOS 下使用Windows *.WAV 文件03-03

在Delphi中巧用Windows 的API函數03-20

Windows環(huán)境下對象的鏈接與嵌入03-16

Visual C#的Excel編程03-19

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频