四、通信软件程序实现 1、首先是通信参数设置,主要就是可以设置端口号,波特率,数据位,停止位,奇偶校验位及设置硬件握手协议,这些设置较为简单。 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+"SJFILES"+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