<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 計算機畢業論文 我要投稿
    • 相關推薦

    深入Windows通信編程

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

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

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

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

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

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

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

    三、Windows通信實例
    實例的通信環境為:本方COMPAQ 4/5

    【深入Windows通信編程】相關文章:

    Windows 2000系統編程-進程的創建12-04

    長距離通信器S1503的應用編程原理03-18

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

    在Windows2000下用多線程實現1394串行總線通信03-20

    探索結對編程03-04

    Windows 中斷程序設計03-28

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

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

    Windows環境下對象的鏈接與嵌入03-16

    Visual C#的Excel編程03-19

    主站蜘蛛池模板: 国产精品jizz视频| 2021国产成人精品久久| 中国精品videossex中国高清| 中文字幕精品无码一区二区| 国产精品∧v在线观看| 成人精品视频99在线观看免费| 人妻少妇精品无码专区动漫| 91av国产精品| 国产精品亚洲片在线va| 精品视频无码一区二区三区 | 久久精品国产亚洲AV嫖农村妇女| 久久精品一区二区影院| 88国产精品欧美一区二区三区| 国产精品丝袜黑色高跟鞋| 亚洲国产精品无码久久一区二区| 久久精品国产亚洲精品| 99精品国产一区二区| 国产精品久久久久…| 精品久久8x国产免费观看| 亚洲欧美一级久久精品| 欧美精品播放| 久久99热这里只有精品国产| 北条麻妃国产九九九精品视频| 99re热这里只有精品视频中文字幕| 日本一卡精品视频免费| 亚洲中文久久精品无码ww16| 亚洲а∨天堂久久精品| 日本精品一区二区三区四区| 久久99亚洲综合精品首页| 久久精品中文字幕有码| 久久国产精品视频| 久久丝袜精品中文字幕 | 在线欧美v日韩v国产精品v| 国产在线拍揄自揄视精品不卡 | 国产精品欧美久久久天天影视| 国产精品亚洲а∨无码播放| 精品人妻系列无码天堂| 国产精品日韩欧美一区二区三区| 久久久久女人精品毛片| 久久永久免费人妻精品下载| 久久精品国产亚洲av日韩|