分享
 
 
 

开发通信软件的技术与技巧

王朝vb·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

开发通信软件的技术与技巧

国防大学图书馆技术室 王渤

【提要】随着计算机应用领域的不断扩展,计算机之间的远程通信用得也越来越广泛,计算机间的远程通信所使用的通信软件,在市面上可以买到,但是通用的通信软件虽然能发送和接收文件,在许方情况下这些通信软件并不能满足实际工作的需要。本文就这一技术进行了探讨,介绍了有关的知识和技术,并由实例分步骤说明如何进行通信软件的开发。

一、前言

本文将以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时:检测到振铃信号。

另外十种情况是通信错误时产生,即错误代码。

四、通信软件程序实现

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+"\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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有