深入Windows通信編程_第1頁
深入Windows通信編程_第2頁
深入Windows通信編程_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

深入Windows通信編程

二、Windows通信疑難探討現(xiàn)將筆者在實(shí)際編程中遇到的疑難和解決辦法描述如下,希望對遇到類似問題的朋友有所啟發(fā)。1.怎樣用Windows未提供的波特率通信?Windows提供了由110bps至256000bps共十三種波特率,一般情況下已足夠使用。但在某種特定情況下,例如通信對方使用150bps、又無法要求對方改變波特率時(shí),Windows通信就比較困難了。首先想到的解決方法是直接調(diào)用BIOS中斷14H來設(shè)置波特率(DOS提供了150bps的波特率)。結(jié)果是Windows屏蔽了該中斷,嘗試失敗。最后的是采用"蒙混過關(guān)"的辦法解決問題的:首先,以任一Windows支持的波特率(例如300bps)構(gòu)造通信參數(shù)字符串,調(diào)用BuildCommDCB產(chǎn)生DCB數(shù)據(jù)結(jié)構(gòu);然后調(diào)用SetCommState設(shè)置通信參數(shù);最后再調(diào)用自編函數(shù)直接修改串口通信寄存器的值。經(jīng)實(shí)驗(yàn),設(shè)置成功,且對Windows程序運(yùn)行無任何不良影響。2.接收數(shù)據(jù)為何"丟失"?通過設(shè)置EnableCommNotification函數(shù)中的cbWriteNotify參數(shù)(在發(fā)送WM_COMMNOTIFY消息之前,通信設(shè)備驅(qū)動(dòng)程序必須向應(yīng)用程序出入隊(duì)列中寫入的字節(jié)數(shù)),可以使系統(tǒng)每收到固定個(gè)字符發(fā)出一WM_COMMNOTIFY消息,這對于固定長度消息型的通信是很方便的。但實(shí)際應(yīng)用時(shí)有時(shí)會(huì)發(fā)生接收數(shù)據(jù)"丟失"現(xiàn)象,即收到WM_COMMNOTIFY消息后從接收隊(duì)列讀出cbNotify個(gè)數(shù)據(jù)時(shí),發(fā)現(xiàn)只有前面部分?jǐn)?shù)據(jù)正確。經(jīng)檢查,"丟失"現(xiàn)象是由于接收數(shù)據(jù)超時(shí)引起的,當(dāng)通信對方時(shí)鐘頻率較低時(shí),規(guī)定時(shí)間內(nèi)收不到cbWriteNotify指定的數(shù)據(jù)量,即所謂"超時(shí)",Windows照樣向應(yīng)用程序發(fā)送帶CN_RECEIVE標(biāo)志的WM_COMMNOTIFY消息。然后,在應(yīng)用程序輸入隊(duì)列數(shù)據(jù)讀出之前,Windows不再發(fā)送該類消息。解決的方法是減小cbWriteNotify的設(shè)定值直到不再發(fā)生"超時(shí)"現(xiàn)象。發(fā)送數(shù)據(jù)時(shí)同樣應(yīng)正確設(shè)定cbOutQue值,以免產(chǎn)生"超時(shí)"現(xiàn)象。如果將cbWriteNotify或cbOutQue設(shè)為-1,則Windows不傳送帶CN_RECEIVE或CN_TRANSMIT標(biāo)志的WM_COMMNOTIFY消息。3.怎樣合理使用FlushComm與GetCommError函數(shù)?FlushComm函數(shù)的功能是清除指定設(shè)備接收或發(fā)送隊(duì)列。GetCommError函數(shù)的功能是返回指定設(shè)備最近錯(cuò)誤碼和當(dāng)前狀態(tài),更重要的是"解鎖"功能:當(dāng)出現(xiàn)通信錯(cuò)誤時(shí),Windows會(huì)鎖死通信端口直到調(diào)用GetCommError。調(diào)用FlushComm的時(shí)機(jī)很重要,如果通信端口發(fā)生錯(cuò)誤,不調(diào)用該函數(shù)就有可能會(huì)使接收隊(duì)列包含不期望的數(shù)據(jù);若隨便調(diào)用該函數(shù),也有可能造成尚未讀入或發(fā)出的數(shù)據(jù)丟失??傊{(diào)用該函數(shù)要做到"心中有數(shù)"。為了合理調(diào)用FlushComm和GetCommError函數(shù),建議在事件掩碼中包含EV_ERR與EV_BREAK。4.Windows多串口通信Windows最多可支持四個(gè)串口的通信,但對于ISA總線的PC,由于其COM1與COM3、COM2與COM4分別共用IRQ3和IRQ4,所以只能同時(shí)使用兩個(gè)串口。MCA、EISA總線系統(tǒng)沒有此限制。如果需要使用的端口不止四個(gè),可以在PC護(hù)展槽中加插多用戶卡,如美國的Comtrol、臺(tái)灣的Moxa(摩莎)等,就可以支持幾個(gè)到幾十個(gè)串口,加上隨卡提供的Windows驅(qū)動(dòng)程序,就可以進(jìn)行多串口通信。具體用法請參閱擴(kuò)展卡說明書。三、Windows通信實(shí)例實(shí)例的通信環(huán)境為:本方COMPAQ4/50微機(jī),安裝中文Windows3.2;對方為8031單片機(jī)。通信參數(shù)設(shè)置:波特率150b

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論