<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • 深入Windows通信編程

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

    深入Windows通信編程

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

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

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

    1.怎樣用Windows未提供的波特率通信?
    Windows提供了由110bps至256000bps共十三種波特率,一般情況下已足夠使用。但在某種特定情況下,例如通信對方使用150bps、又無法要求對方改變波特率時,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è)置成功,且對Windows程序運行無任何不良影響。

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

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

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

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

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

    Windows 2000系統(tǒng)編程-進程的創(chuàng)建12-04

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

    用Borland C 3.1實現(xiàn)外設(shè)與Windows應(yīng)用程序?qū)崟r通信03-21

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

    探索結(jié)對編程03-04

    Windows 中斷程序設(shè)計03-28

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

    在Delphi中巧用Windows 的API函數(shù)03-20

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

    Visual C#的Excel編程03-19

    主站蜘蛛池模板: 无码日韩精品一区二区人妻 | 精品无码国产污污污免费网站国产| 中文无码精品一区二区三区| 国产精品午夜一级毛片密呀| 国产精品日韩欧美制服| 亚洲综合精品网站| 精品少妇一区二区三区在线 | 国产精品18久久久久久vr| 亚洲AV乱码久久精品蜜桃| 欧美亚洲精品中文字幕乱码免费高清 | 欧美成人精品高清在线播放| 国产A∨国片精品一区二区| 99久久这里只有精品| 国产精品无码一区二区三级 | 亚洲精品免费在线观看| 国产第一福利精品导航| 精品欧洲av无码一区二区三区| 亚洲精品无码永久中文字幕| 亚洲精品二三区| 亚洲视频在线精品| 亚洲午夜精品第一区二区8050| 久久精品国产99久久久香蕉| 精品国产人成亚洲区| 国产在线精品国自产拍影院| 精品久人妻去按摩店被黑人按中出| 99久久精品免费观看国产| 66精品综合久久久久久久| 99久久夜色精品国产网站| 国产精品国产三级在线高清观看| 国产精品一区二区av不卡| 精品日韩在线视频一区二区三区| 久久久久久亚洲精品不卡 | 老司机性色福利精品视频| 亚洲精品无码不卡在线播HE| 日韩人妻精品一区二区三区视频| 久久国产乱子伦免费精品| 久久久精品人妻一区二区三区四| 日韩精品乱码AV一区二区| 精品人无码一区二区三区| 国产成人精品高清在线观看93 | 国产成人精品免费视频动漫|