精品一区二区中文在线,无遮挡h肉动漫在线观看,国产99视频精品免视看9,成全免费高清大全

深入Windows通信編程

時(shí)間:2023-05-01 08:05:53 計(jì)算機(jī)論文 我要投稿
  • 相關(guān)推薦

深入Windows通信編程

一、Windows通信機(jī)制

Windows與DOS編程的重要差別在于Windows程序是消息驅(qū)動(dòng)和設(shè)備統(tǒng)一管理。體現(xiàn)在通信方面,DOS中的寄存器直接讀寫(xiě)、BIOS調(diào)用和通信中斷程序等編程方法都不能或不宜采用。Windows通過(guò)通信驅(qū)動(dòng)程序COMM.DRV與硬件接口,向程序員提供了多達(dá)17個(gè)標(biāo)準(zhǔn)函數(shù),功能強(qiáng)大,但也增加了理解和編程的難度。

Windows3.1通信函數(shù)主要有:

OpenComm

打開(kāi)一通信設(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è)備寫(xiě)字符

FlushComm清除一發(fā)送或接收隊(duì)列

GetCommEventMask返回通信事件掩碼

GetCommState返回設(shè)備控制塊(DCB)

GetCommError恢復(fù)通信設(shè)備狀態(tài)

CloseComm關(guān)閉一通信設(shè)備

DCB數(shù)據(jù)結(jié)構(gòu)、其它通信函數(shù)及各函數(shù)的具體用法請(qǐng)參見(jiàn)有關(guān)資料。

一般Windows通信編程應(yīng)包括兩部分:設(shè)備初始化及WM_COMMNOTIF

Y消息處理。

設(shè)備初始化典型流程如圖1。

圖1

WM_COMMNOTIFY消息處理典型流程如圖2。

圖2

對(duì)于大多數(shù)實(shí)際通信來(lái)說(shuō),可能只需要處理流程圖中的一部分。

設(shè)備初始化及WM_COMMNOTIFY消息處理兩部分密切相關(guān)。所有類(lèi)型WM_COMMNOTIFY消息的傳送都是因?yàn)樵诔跏蓟瘮?shù)中進(jìn)行了相應(yīng)的設(shè)置。

換言之,可以根據(jù)通信的實(shí)際情況有選擇地設(shè)置,控制Windows向應(yīng)用程序發(fā)送的WM_COMMNOTIFY消息的數(shù)量和類(lèi)型,以期達(dá)到高效、可靠的通信。例如,對(duì)于固定長(zhǎng)度消息型的通信可以在EnableCommNotification函數(shù)中設(shè)置cbWriteNotify和cbOutQueue參數(shù)為消息長(zhǎng)度;對(duì)于以固定字符結(jié)尾的消息型通信可以在事件掩碼中包括EV_RXFLAG,將DCB數(shù)據(jù)結(jié)構(gòu)中的EvtChar變量置為結(jié)尾字符,然后調(diào)用SetCommState和SetCommEventMask函數(shù);對(duì)于遵循V.25bis之類(lèi)協(xié)議的通信,由于用到了大量信號(hào)線(xiàn)來(lái)作握手信號(hào),則事件掩碼中要包含EV_CTS、EV_DSR、EV_RSLD及EV_RING等;而對(duì)于文件傳送型的通信,則宜將OpenComm函數(shù)中的cbInQue和cbOutQue變量、EnablecCommNotification中的cbWriteNotify和cbOutQueue變量設(shè)置為較大值,以加快文件傳送速度。

二、Windows通信疑難探討

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

1.怎樣用Windows未提供的波特率通信?

Windows提供了由110bps至256000bps共十三種波特率,一般情況下已足夠使用。但在某種特定情況下,例如通信對(duì)方使用150bps、又無(wú)法要求對(duì)方改變波特率時(shí),Windows通信就比較困難了。

首先想到的解決方法是直接調(diào)用BIOS中斷14H來(lái)設(shè)置波特率(DOS提供了150bps的波特率)。結(jié)果是Windows屏蔽了該中斷,嘗試失敗。

最后的是采用"蒙混過(guò)關(guān)"的辦法解決問(wè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è)置成功,且對(duì)Windows程序運(yùn)行無(wú)任何不良影響。

2.接收數(shù)據(jù)為何"丟失"?

通過(guò)設(shè)置EnableCommNotification函數(shù)中的cbWriteNotify參數(shù)(在發(fā)送WM_COMMNOTIFY消息之前,通信設(shè)備驅(qū)動(dòng)程序必須向應(yīng)用程序出入隊(duì)列中寫(xiě)入的字節(jié)數(shù)),可以使系統(tǒng)每收到固定個(gè)字符發(fā)出一WM_COMMNOTIFY消息,這對(duì)于固定長(zhǎng)度消息型的通信是很方便的。但實(shí)際應(yīng)用時(shí)有時(shí)會(huì)發(fā)生接收數(shù)據(jù)"丟失"現(xiàn)象,即收到WM_COMMNOTIFY消息后從接收隊(duì)列讀出cbNotify個(gè)數(shù)據(jù)時(shí),發(fā)現(xiàn)只有前面

[1] [2] [3] [4] 

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

深入04-29

WINDOWS XP教案04-25

編程的心得03-14

給機(jī)器編程04-28

安裝Windows或啟動(dòng)Windows時(shí)鼠標(biāo)不可用06-20

windows及應(yīng)用實(shí)踐報(bào)告04-14

初識(shí)Windows的教學(xué)方案01-17

數(shù)控編程心得05-07

編程語(yǔ)言排名04-29

windows操作實(shí)驗(yàn)報(bào)告09-03