求助,谁有MSComm控件的下载地址及使用说明。 多谢!!!!!![?](100分)

  • 主题发起人 主题发起人 水山
  • 开始时间 开始时间

水山

Unregistered / Unconfirmed
GUEST, unregistred user!
求助,谁有MSComm控件的下载地址及使用说明。 多谢!!!!!!
 
//两大篇,
如何用Delphi开发串口通信程序

如何用Delphi开发串口通信程序
熊彪
Delphi 是新一代可视化开发工具,它具有功能强大、简便易用和代码执行速度快等特点,Delphi系列开发工具在国际各媒体上曾获得过三十多项大奖,是全球公认的快速应用开发工具技术的先驱者,他越来越在构架企业信息系统方面发挥着重要作用。
它的功能很强大,但在对串口通信的控制上Delphi的帮助文档和其他书籍中很少提及,可这是在开发应用系统时会经常遇到却又令人头痛的事情。下面介绍三种解决方案,以实现接收和发送数据的功能。

一、 使用ActiveX控件
由于Delphi中没有串口控件可用,所以首先需要把ActiveX控件MSCOMM加到元件选项板上。这是一个非常好的控件它不仅能对串口进行操作,而且还可以对Modem进行控制。下面结合一个具体的实例来说明如何用MSCOMM控件开发出串口通信程序。
创建一个Communication.dpr工程,把窗体的Name属性变为CommForm,将标题改为The Communication Test,选择File/Save As将新的窗体存储为CommFrm.pas,接下来参照图1和图2将控件添加到主窗体中。

图1 图2
由图1和图2我们可以看出,通过设置页可选定进行数据传输的通信端口和端口的波特率、奇偶校验、数据位和停止位,通信时每传输一个字符都将触发响应事件,在通信页“传输显示”位置可看到当前正在进行传输的数据。同时当出现回车换行符时将整行内容显示在memDisplay新的一行中,而全部接收的内容还将存在一个文件中。部分源代码如下:
变量说明
var
CommForm: TCommForm;
ss :string;
savef,readf :file of char;
i,j :longint;

初始化
procedure TCommForm.FormCreate(Sender: TObject);
begin
mscomm.commport:=1;
mscomm.settings:='9600,n,8,1';
mscomm.inputlen:=1;
mscomm.inbuffercount:=0;
mscomm.portopen:=true;
ss:='';
i:=0;
j:=0;
assignfile(savef,'save1');
rewrite(savef);
assignfile(readf,'read1');
reset(readf);
end;

设置确定
procedure TCommForm.btnConfirmClick(Sender: TObject);
begin
if mscomm.portopen then
mscomm.portopen:=false;
mscomm.commport:=strtoint(edtCommport.text);
mscomm.settings:=edtCommsetting.Text;
end;

传输事件
procedure TCommForm.MSCommComm(Sender: TObject);
var
filenrc :char;
buffer :variant;
s1:string;
c :char;
begin
case mscomm.commEvent of
comEvSend:
begin
while not(eof(readf)) do
begin
read(readf,filenrc);
mscomm.output:=filenrc;
j:=j+1;
lblDisplay.caption:=inttostr(j);
if mscomm.outbuffercount>=2 then
break;
end;
end;
comEvReceive:
begin
buffer:=mscomm.Input;
s1:=buffer;
c:=s1[1];
ss:=ss+c;
i:=i+1;
lblDisplay.caption:=c+inttostr(i);
write(savef,c);
if (c=chr(10))or(c=chr(13)) then
begin
lblDisplay.caption:='cr'+inttostr(i);
memDisplay.lines.add(ss);
ss:='';
end;
end;
end;
end;

当然还有许多串口控制的ActiveX控件,有控件用是方便,但是是否说没有控件就不能用Delphi本身解决问题呢。那么就请来看一下下面的解决方案:

二、使用行间汇编
对于硬件的控制,汇编语言是最方便的了,而Delphi中又允许使用行间汇编那么来看一下怎样使用行间汇编接收下位机传来的数据,在下面的例子中我们简化了问题,比如我们通过COM2接收400个传来的字符并将这些内容保存在AAA.DAT文件中当接收完毕后显示‘Receive end’。但是为什么说我们简化了问题呢,因为实际情况中双方通信可能是约定传送字符的个数,也可能约定的是规定好的起始字符和结束字符,或是多种条件同时约定待各种条件全部满足时才表示完成一次成功的接收否则如有一个条件未满足都表示接收失败需要重新传送。这些约定在使用了行间汇编的Delphi程序中都可实现。下面的程序就是按一个按钮进入的一个简化的串口接收程序。
procedure TForm1.Button1Click(Sender: TObject);
var ca:array[1..400]of char;
c:char;
i,j:integer;
f1:file of char;
label loop1;
begin
i:=1;
asm
mov dx,0001
mov ax,005eh
int 14h
end;
for j:=1 to 400 do
begin
asm
loop1: mov dx,0001
mov ah,02
int 14h
test ah,80h
jnz loop1
mov c,al
end;
ca:=c;
i:=i+1;
end;
assignfile(f1,'aaa.dat');
rewrite(f1);
for j:=1 to i-1 do
write(f1,ca[j]);
closefile(f1);
label1.caption:='receive end';
end;

三、用Delphi调用可执行应用程序
采用其它编程技术编制的串口通信程序在完成数据传输后将数据保存到磁盘上,然后用Delphi对数据内容进行处理。通过在Delphi中与其他编程技术协同工作也不失为一种解决问题的好方法。




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



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

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

一、前言
  本文将以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&amp
'循环发送
If LF&amp;-Loc(hSend)<BSIZE Then
BSIZE=LF&amp;-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
 
MSCOMM装了VB就有了
如果你没有 留下你的邮箱 我可以发给你
 
你要吗我给你mail过去?
 
请blankblock@263.net发过来,控件60分,说明20分。
多谢!
 
后退
顶部