國防大學圖書館技術室 王渤
【提要】隨著計算機應用領域的不斷擴展,計算機之間的遠程通信用得也越來越廣泛,計算機間的遠程通信所使用的通信軟件,在市面上可以買到,但是通用的通信軟件雖然能發送和接收文件,在許方情況下這些通信軟件并不能滿足實際工作的需要。本文就這一技術進行了探討,介紹了有關的知識和技術,并由實例分步驟說明如何進行通信軟件的開發。
一、前言
本文將以VB5.0所帶的通信控件MSCOMM進行通信軟件的開發,它有約30個屬性和事件(可以從聯機幫助中找到其使用資料)。本文簡述它的主要屬性及事件,并歸類整理。
利用串行端口與調制解調器進行連接時,對于用MSCOMM控件編制通信軟件來說,只需了解以下五根線的代號及作用。以下五根線的高電平/低電平狀態分別對應MScomm控件的相應屬性的True/False值。
(1)DTR線:PC發往MODEM,表示PC機是否已準備好。
(2)RTS線:PC發往MODEM,表示PC機是否允許modem發回數據.
(3)DSR線:MODEM發往PC,表示MODEM是否已做好操作準備
(4)CTS線:MODEM發往PC,表示MODEM是否允許發送數據
(5)CD線:MODEM發往PC,表示MOEDM已經與呼叫的遠方MODEM處于連結狀態
二、MSCOMM控件的屬性
屬性
值
作用
CommPort
用1,2,...表示串口COM1,COM2....
設置或返回聯接MODEM的串口的編號
Settings
例用"19200,N,8,1"表示傳輸速率為19200bps,沒有奇偶校驗位,8位數據位,1位停止位。
設置或返回通信參數。
Handshaking
0沒有握手協議,不考慮流量控制。
1XON/XOFF,即在數據流中嵌如控制苻來進行流控。
2RTS/CTS,既由信號線RTS/CTS自動進行流量控制(常用)。
3兩者皆可。
設置或返回硬件握手協議,指的是PC機MODEM之間為了控制流速而約定的內部協議。
PortOpen
True/False可以打開/關閉端口。
打開或關閉端口。
OutBufferSize
傳輸緩沖區的字節數,如選1024。
設置或返回傳輸緩沖區大小。
OutPut
Variant型變量。
向傳輸緩沖區寫數據流。
傳輸文本數據時,應將String型數據放入Variant變量,傳輸二進制數據(即按字節)時,應將Byte型數組數據放入Variant變量
InBufferSize
接收緩沖區的字節數,如選1024。
設置或返回接收緩沖區大小。
InputMode
0用Input屬性接收文本型數據。
1用Input屬性接收二進制數據。
設置或返回接收數據的數據類型。
InBufferCount
Integer型
返回接收緩沖區中已傳到但還未取走的字符個數。
Input
當InputMode屬性值為0(文本模式)時,變量中含String型數據。
當InputMode屬性值為1(二進制模式)時,變量中含Byte型數組數據。
將接收緩沖區中收到的數據讀入變量。
DTREnabled
RTSEnabled
DSRHolding
CTSHolding
CDHolding
均取值TRUE/FALSE
用于讀取或控制pc機與modem之間的交互狀態。需運用好。例如,應在讀取到DSRHolding屬性值為TRUE時再向MODEM發出命令。應當在載波檢測到以后(CDHolding屬性為TRUE)時再向MODEM發送數據。
三、MSCOMM控件的觸發事件
MSCOMM控件只使用一個事件OnComm,用屬性CommEvent的十七個值來區分不同的觸發時機。主要有以下幾個:
。1)CommEvent=1時:傳輸緩沖區中的字符個數已少于Sthreshold(可設置的屬性值)個。
。2)CommEvent=2時:接收緩沖區中收到hreshold(可設置的屬性值)個個字符,利用此事件可編寫接收數據的過程。
。3)CommEvent=3時:CTS線發生變化。
。4)CommEvent=4時:DSR線發生變化。
。5)CommEvent=5時:CD線發生變化。
。6)CommEvent=6時:檢測到振鈴信號。
另外十種情況是通信錯誤時產生,即錯誤代碼。
四、通信軟件程序實現
。、首先是通信參數設置,主要就是可以設置端口號,波特率,數據位,停止位,奇偶校驗位及設置硬件握手協議,這些設置較為簡單。
2、向MODEM發出DTR(已準備好)信號,如下例程:
If MSComm1.PORTOPEN Then
MSComm1.DTREnable=True
Else
MSComm1.DTREnable=False
EndIf
3、打開時向MODEM發出一些命令來設置參數,其中S0=n(n>=1)自動應答.n為響鈴次數;E0/E1關閉/打開命令字符回應;Q0/Q1modem返回/不返回結果碼;M0/M1關閉/打開MODEM揚聲器,例程如下:
If MSComm1.PORTOPEN Then
Do While not MSComm1.CTSHolding : loop
Outstring="ATS0=1E1Q0M0"+Chr(13)
MSComm1.Output=Outstring
End if
4、進行撥號設計,需向MODEM發出ATDT命令,如下語句:
MSComm1.Output="ATDT"+Trim(“電話號碼”)+Chr(13)
5、撥號以后發送數據文件,程序要循環等待并隨時判定是否接通。如果MODEM向PC的回應字符串中含有"Connect"或CDHolding屬性值變為True(檢測出載波),則表示已與遠方MODEM連機了,此時可以傳輸數據。
程序設計發送及接收程序時,需要以下定義:
S_FILENAME = "NAME" + Chr(5) + Chr(13) + Chr(10)
S_FILELEN = "LENTH" + Chr(5) + Chr(13) + Chr(10)
S_FILESEND = "BEGIN" + Chr(5) + Chr(13) + Chr(10)
Sub OpenFileToSend() '打開一個欲發送的文件
HSend = FreeFile
Open SENDFN For Binary As hSend 'SENDFN中含有由用戶選定的要傳送的文件名。
LF&=LOF(hSend) '文件長度為LF&
'開始發送文件名,文件長度,文件開始等信息字符串。
Dim Data as Vrait
Data = S_FILENAME
MSComm1.Output=Data '發出"FILENAME"文件名字串的提示信息
Data = SENDFN +Chr(13)+Chr(10)
MSComm1.Output=Data '發出文件名
Data = S_FILELEN
MSComm1.Output=DATA '發出"FILELEN"提示字串
Data = Trim(Str(LF&))+Chr(13)+Chr(10)
MSComm1.Output=Data '發出文件大小
Data = S_FILESTAR
MSComm1.Output=Data '發出"FILESTART"提示信息,表示下面文件開始。
Dim Sendarr() as byte '定義字節型數組
Sum=0 '記錄累計發送的字節數
BSIZE=MSComm1.OutBufferSize '每次發送的塊大小
ReDim Sendarr(1 To BSIZE) '重新定義讀取緩沖
Do While Sum<LF& '循環發送
If LF&-Loc(hSend)<BSIZE Then
BSIZE=LF&-Loc(hSend)
ReDim Sendarr(1 To BSIZE)
End If
Get hSend ,, SENDARR '從文件取字節放入字節數組
Sendvar=Sendarr '轉放到Variant型變量
'當CTS線及CD線為高電平時才可發送,否則需等待。
T=Timer+60
L:
If MSComm1.CTSHolding And MSComm1.CDHolding Then
MSComm1.Output=Sendvar '發送
Sum = Sum + BSIZE'累加計數
Else
If Timer < T Then
Go To L '循環等待
Else
Go To CLOSEFILE '等待時間超過60秒則退出
End If
End If
'等待系統處理完
Do
RET = DoEvents()
Loop Until MSComm1.OutBufferCount = 0
Loop '循環發送完畢。
6、接收MODEM送回的信息和數據文件,該過程是編寫mscomm1控件的OnCOMM事件的處理程序來完成。為了接收文本類型的握手信號,通常使InputMode屬性為文本模式。當發現接收到的字符串中有"FILESTAR"+Chr(5)+Chr(13)+Chr(10),則將InputMode屬性改為二進制模式。當文件內容接收完(由接收的字節數判斷)再將InputMode屬性改為文本模式。例程如下:
Private Static Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive '接收緩沖區收到Rthreshold個字符時觸發
Dim DATA As Variant
Dim N As Long
Dim SJARR() As Byte
N=MSComm1.InBufferCount '接收緩沖區字符總數
If MSComm1.InputMode=0 Then'文本模式時,將收到的數據放到字符串變量。
MSComm1.InputLen=0
DATA = Space(N)
DATA = MSComm1.Input
Else '二進制模式時,將收到的數據放到字節數組。
ReDim S JARR(1ToN)
DATA=ARR
MSComm1.InputLen=N
DATA=MSComm1.Input
End If
'其它case情況略
End Select
End Sub
7、關于接收到的數據的處理例程:
Public Static Sub HandleData (Disp As Control,N As Long,DATA As Variant)
'參數:Disp(文本框,用于顯示接受數據)
'N為本次接收到的字節數
'DATA(接收到的數據.Variant型)
If not mscomm1.InputMode=0 Then '接收的是字符串
Go To L2
End If
Disp.SelStart = Len ( Disp.Text)
Disp.SelLength = 0
Disp.SelText = DATA '顯示字符數據
If InStr(1,Disp.Text,S_FILESTAR,0)=0 Then '若沒有開始標志就結束此過程
ExitSub
EndIf
V_FILENAME = InStr(1,Disp.Text,S_FILENAME,0) '找文件名及文件長度
V_FILELEN = InStr(1,Disp.Text,S_FILELEN,0)
FN = Mid(Disp.Text,V_FILENAME+11,(V_FILELEN-V_FILENAME-13))
HJS = FreeFile'打開接收文件
JSFN = Pathc+"\SJFILE\S"+Trim(Str(NO))+"_"+FN
Open JSFN For Binary As HJS
V_FILENAME = InStr(1,Disp.Text,S_FILENAME,0)
V_FILELEN = InStr(1,Disp.Text,S_FILELEN,0)
FN = Mid(Disp.Text,V_FILENAME+11,(V_FILELEN-1)-(V_FILENAME+11))
FL = Mid(Disp.Text,V_FILELEN+11,V_FILESTAR-(V_FILELEN+10))
SENDLEN = Val(FL) '應收總字節數SENDLEN
ReDim JSARR(0 To N-1)
JSARR=DATA '將字節流放入字節型數組
Puth JS , , JSARR ' 寫入已打開的接收文件
JSLEN=JSLEN+N '本次已累計收到的字節數
Close HJS
End Sub
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/
領測軟件測試網最新更新
關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月