在Delphi中用SPCOMM实现串口编程
更新时间:2024-06-24 09:35:01 阅读量: 综合文库 文档下载
先把那个comm32复制到你安装DELPHI的目录下,然后打开delphi,在
tools-->environment options-->library-->library path中,选择你刚才复制到的目录,确
定!
然后再在component-->install component-->unit file name中,选择spcomm.pas,确
定就可以了!
在Delphi中用SPCOMM实现串口编程
Delphi是一种具有功能强大、简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选择 Delphi作为开发工具编制各种应用程序。但是,美中不足之处是 Delphi没有自带的串口通信控件,在它的帮助文档里也没有提及串口通信,这就给编制通信程序的开发人员带来许多不便。
目前,利用 Delphi实现串口通信的常用的方法有 3种:一是利用控件,如 MSCOMM控件和 SPCOMM控件;二是使用 API函数;三是调用其他串口通信程序。其中利用 API编写串口通信程序较为复杂,需要掌握大量的通信知识。相比较而言,利用 SPCOMM控件则相对较简单,并且该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作,而且还支持多线程。下面本文结合实例详细介绍 SPCOMM控件的使用。
SPCOMM的安装
1.选择下拉菜
单 Component中的 Install Component选项,弹出如图 1所示的窗
口。
在 Unit file name处填写 SPCOMM控件所在的路径,其他各项可用默认值,点击 OK按钮。
2.安装后,在 System控件面板中将出现一个红色控件 COM。现在就可以像 Delphi自带控件一样使用 COM控件了。
SPCOMM的属性、方法和事件 1.属性
●CommName:表示 COM1、 COM2等串口的名字;
●BaudRate:根据实际需要设定的波特率,在串口打开后也可更改此
值,实际波特率随之更改;
●ParityCheck:表示是否需要奇偶校验;
●ByteSize:根据实际情况设定的字节长度;
●Parity:奇偶校验位;
●StopBits:停止位;
●SendDataEmpty:这是一个布尔型属性,为 true时表示发送缓存为空,或者发送队列里没有信息;为 false时表示发送缓存不为空,或者发送队列里有信息。 2.方法
●Startcomm方法用于打开串口,当打开失败时通常会报错。错误主要有 7种:⑴串口已经打开;⑵打开串口错误;⑶文件句柄不是通信句柄;⑷不能够安装通信缓存;⑸不能产生事件;⑹不能产生读进程;⑺不能产生写进程;
●StopComm方法用于关闭串口,没有返回值;
●
WriteCommData(pDataToWrite:
PChar;dwSizeofDataToWrite:Word )方法是个带有布尔型返回值的函数,用于将一个字符串发送到写进程,发送成功返回 true,发送失败返回 false。执行此函数将立即得到返回值,发送操作随后执行。该函数有两个参数,其中 pDataToWrite是要发送的字符串, dwSizeofDataToWrite是发送字符串的长度。 3.事件 ●
OnReceiveData
:procedure
(Sender:
TObject;Buffer:
Pointer;BufferLength: Word) of object
当有数据输入缓存时将触发该事件,在这里可以对从串口收到的数据进行处理。 Buffer中是收到的数据, BufferLength是收到的数据长度。
●OnReceiveError : procedure(Sender: TObject; EventMask : DWORD)
当接收数据出现错误时将触发该事件。
SPCOMM的使用
下面是一个利用 SPCOMM控件的串口通信的例子。
以实现 PC机与单片机 8051之间的通信为例,首先要调通它们之间的握手信号。假定它们之间的通信协议是: PC到 8051一帧数据 6个字节, 8051到 PC一帧数据也为 6个字节。当 PC发出( F0,01,FF,FF,01,F0)后 8051能收到一帧( F0,01,FF,FF,01,F0),表示数据通信握手成功,两者之间就可以按照协议相互传输数据。
创建一个新的工程 COMM.DPR,把窗体的 NAME属性定为 FCOMM,把窗体的标题定义为测试通信,按照图 2添加控件 (图 2中黑色矩形围住的控件即为 COMM1)。
图 2
1.设定 COMM1属性:
●波特率: 4800;
●奇偶校验位:无;
●字节长度: 8;
●停止位: 1;
●串口: COM1。
Memo1中将显示发送和接收的数据。将新的窗体存储为 Comm.pas。
2.编写源代码
//变量说明 var
fcomm: TFCOMM;
viewstring:string;
i:integer;
rbuf,sbuf:array[16] of byte;
//打开串口
procedure TFCOMM.FormShow(Sender: TObject); begin
comm1.StartComm; end;
//关闭串口
procedure TFCOMM.FormClose(Sender: TObject; TCloseAction); begin
comm1.StopComm;
var Action: end;
//自定义发送数据过程
procedure senddata; var i:integer;
commflg:boolean; begin
viewstring:=‘’ ;
commflg:=true;
for i:=1 to 6 do begin
if not fcomm.comm1.writecommdata(@sbuf[i],1) then begin
commflg:=false; break; end;
//发送时字节间的延时 sleep(2);
viewstring:=viewstring+ inttohex(sbuf[i],2)+‘’
viewstring:=‘发送’+ viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add(‘’ );
; end;
if not commflg then messagedlg(‘发送失败 !’ ,mterror,[mbyes],0); end;
//发送按钮的点击事件
procedure TFCOMM.Btn_sendClick(Sender: TObject); begin
sbuf[1]:=byte($ f0); //帧头
sbuf[2]:=byte($ 01); //命令号
sbuf[3]:=byte($ ff);
sbuf[4]:=byte($ ff);
sbuf[5]:=byte($ 01);
sbuf[6]:=byte($ f0); //帧尾
senddata;//调用发送函数 end;
//接收过程
procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); var i:integer; begin
viewstring:=‘’ ;
move(buffer^,pchar(@rbuf^),bufferlength);
for i:=1 to bufferlength do
viewstring:=viewstring+ inttohex(rbuf[i],2)+‘’ ;
viewstring:=‘接收’+ viewstring;
memo1.lines.add(viewstring);
memo1.lines.add(‘’ ); end;
如果 memo1上显示发送 F0 01 FF FF 01 F0和接收到 F0 01 FF FF 01 F0,这表示串口已正确地发送出数据并正确地接收到数据,则串口通信成功。
如何用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[i]:=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中与其他编程技术协同工作也不失为一种解决问题的好方法。
SPCOMM控件在Delphi7.0串口通信中的应用 2007年04月25日 星期三 19:01
SPCOMM控件在Delphi7.0串口通信中的应用
摘要:利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而串口通信是这个过程中必须解决的问题之一。本文在对几种常用串口通信方法分析比较的基础上,着重讨论了Delphi开发环境下利用Spcomm控件实现PC机与单片机之间串口通信的方法,研究了Spcomm串口通信的关键技术问题,并通过一个实例给出了Spcomm控件在Delphi7.0串口通信中的应用。 关键词:串口通信;Delphi7.0;Spcomm控件 1 引言
目前, 随着现代信息技术的发展,计算机串口通信技术已日趋成熟。由于微机性能价格比高、分析处理能力强、处理速度快以及单片机抗干扰能力强、使用灵活等特点,利用PC机作为上位机,单片机作为下位机的主从工作方式在工业控制领域中被广泛采用。无忧S3C2410 ARM9开发板 S3C44B0 ARM7 开发板350元单片机开发系统498元无忧单片机实验开发板238元
PC机与下位机的通信可以采用高级语言编程实现,如Delphi、VC等。Delphi 是新一代面向对象的可视化开发工具,它具有功能强大、简便易用和代码执行速度快等特点,越来越在构架企业信息系统方面发挥着重要作用。由于Delphi 这些显著特点,利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而实现系统监测控制和信息处理的关键是解决PC机与单片机之间的串口通信问题。 2.Spcomm串口通信组件简介
用Delphi 实现串口通信,常用的方法有:使用控件,如Mscomm和Spcomm控件等;使用API函数;在Delphi 中调用其它串口通信程序[1]。使用API方法的优点是比较适合于编写较为复杂的低层次通信程序,但缺点是编写串口通信程序较为复杂,需要掌握大量通信知识。Spcomm是Small-Pig Team开发的一个第三方Delphi串口控件[2],该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作,且编程简单、通用性强、可移植性好。在Delphi软件开发中已经成为一个被广泛应用的串口通信开发控件。 Spcomm共实现了三个类:串口类Tcomm、读线程类TreadThread以及写线程类TwziteThread[1]。Tcomm的某个实例在方法StartComm中打开串口,并实例化了一个读线程ReadThread和一个写线程WriteThread,它们和主线程之间进行消息的传递,实现串口通信。
在Delphi7.0中安装Spcomm串口通信控件的方法为:选择Delphi7.0的“Component”菜单,点击“Install Component...”菜单项,然后在弹出的Into existing package属性页中Unit file name输人框中选择SPCOMM.pas文件,单击两次 “OK”按钮后,就可以将Spcomm控件安装到Delphi7.0的System组件页上。 3 Spcomm控件串口通信的实现
3.1 Spcomm控件的基本属性、方法和事件
Spcomm串口通信控件的基本属性、方法和事件说明如下:
CommName属性:计算机串口端口号的名字,COM1、COM2……等,在打开串口前,必须填写好此值。 Parity属性:校验位 None、Odd、Even、Mark、Space等。
BaudRate:设定支持串口通信用的波特率9600,4800等,根据实际需要来定,在串口打开后也可更改波特率,实际波特率随之更改。
ByteSize属性:表示一个字节中,使用多少个数据位收发数据,根据具体情况设定5、6、7、8等。 StopBits属性:表示一个字节中,使用停止位的位数,根据具体情况设定1、1.5、2等。
SendDataEmpty属性:布尔属性,为True时表示发送缓存为空,或者发送队列里没有信息;为False时表
示表示发送缓存不为空,或者发送队列里有信息。
StartComm方法:用来打开通信串口,开始通信。如果失败,则会导致串行口错误。错误类型大致分为串行口己处于打开状态,所以不能打开串行口,不能创建读写进程,不能建立串行口缓冲区等。 StopComm方法:用来停止通信串行口的所有进程,关闭串口。
WriteCommData(pDataToWrite:PChar;dwSizeofDataToWrite:Word)方法是带有布尔型返回值的函数,其中参量pszStr-ingToWrite是要写入串行口的字符串,DwSizeaf- DataToWrite是要写入的字符串的长度。该函数通过一个写线程向串行口输出缓冲区发送数据。发送操作将在后台默认执行。如果写线程PostMessage成功,则返回值是True,若写线程失败,返回值是False。
OnReceiveData(Buffer:Pointer;BufferLength:Word),其中Buffer是指向输入缓冲区的指针。BufferLength是从缓冲区收到的数据长度。当输入缓冲区收到数据时,该事件被触发。当输入缓存有数据时将触发该事件,对从串口收到的数据进行处理。 3.2 Spcomm串口通信的实现
Spcomm串行通信控件具有多线程的特性,接收和发送数据分别在两个线程内完成,接收线程负责收到数据时触发OnReceiveData事件;用WriteCommData()函数将待发送的数据写入输出缓冲器,发送线程在后台完成数据发送工作。在接收和发送数据前需要初始化串口,用StartComm方法打开串口,退出程序时用StopComm方法关闭串口。
实现PC机与单片机之间的数据发送及接收需要以下步骤: (1)初始化并打开串口
需要选择本次通信使用的串口,确定通信协议,即设置波特率、校验方式、数据位、停止位等属性,打开该串口。示例代码如下:
//初始化并打开串口
Comm1.BaudRate:=9600;//波特率9600bps Comm1.Parity:=None;//奇偶检验无 Comm1.ByteSize:=8;//数据位8 Comm1.StopBits:=1;//停止位1 Comm1.StartComm; //打开串口 (2)建立握手信号
实现PC机与单片机之间的通信,首先要调通它们之间的握手信号,握手信号可以随意选择某特定字符串, 当PC发出这样一帧数据后,通过接收事件能收到单片机返回的这一帧数据或特定的某字符串,则表示握手成功,系统通信正常。两者之间就可以按照协议相互传输数据。否则需重新建立握手信号。 (3)发送数据
在编写基于串口的计算机工业测控时,通常需要由PC机向下位机发送命令以控制下位机的行为,同时向下位机发送有关数据。利用Spcomm串口控件向下位机发送数据示例代码如下:
//发送数据和控制字程序 procedure senddata; var
i:integer; commflg : Boolean; begin
commflg:=true ; for i:=1 to 8 do begin
if not fcomm comml writecommdata(sendbutter,i) then begin
Commflg=false; break; end; end; end;
(4) 接收数据
在编写基于串口的计算机工业测控时,通常需要由下位机向PC机发送数据以使PC机了解系统的测试数据或下位机的运行状态,并进而控制下位机的行为。利用Spcomm串口控件接收下位机发送的数据信息的示例代码如下:
//事件驱动方式接收数据程序
procedure TForm1.CommlReceiveData(Sender:Tobject; Buffer:Pointer; bufferLength:Word); var
receivedata:array of byte; begin
sleep(100);//等待100ms,保证接收到所有数据 move(buffef ,receivedata,bufferlength); //将接收缓存区中的数据转移到数组中 …… end;
(5) 关闭串口
在系统开发中,应注意在不使用串口时应及时关闭串口,释放系统资源,否则可能会影响系统的其它应用。关闭串口的代码如下:
procedure TForm1.FormClose ( Sender;TObj ect:var Action:TCIoseAction ); begin
comml.StopComm ; end;
4 Spcomm串口通信的关键技术问题
Spcomm应用的核心在于主线程、读线程和写线程之间的消息传递机制,而通信数据相关信息的传递也是
以消息传递的方式进行的。在使用Spcomm进行串口通信编程,除按照说明使用外,还需要特别注意以下两个问题。
首先,Spcomm是通过ReadIntervalTimeout属性的设置,来确定所接收到的数据是否属子同一帧数据,其默认值是100ms,也就是说,只要任何两个字节到达的时间间隔小于1OOms,都被认为是属于同一帧数据,在与单片机协同工作时,要特别注意这个问题[2]。
另外,Spcomm的默认属性设置是支持软件流控制的,用于流控制的字符是13H(XoffChar)和11H(XonChar),当单片机以二进制方式发送数据时,必须要禁用Spcomm对于软件流控制的支持,否则,在数据帧中出现的13H,11H会被Spcomm作为控制字符而加以忽略。 5 结论
实践证明,利用Spcomm串行通信控件在Delphi7.0中开发串口通信程序,具有灵活、方便、高效的特点。本文作者创新点是在认真分析多个基于计算机串口工控测控系统的基础上,分析了利用Spcomm控件实现PC机与单片机之间串口通信的方法,研究了Spcomm串口通信的关键技术问题。在实际应用中取得了较好的应用效果,具有一定的实践指导意义。
SPCOMM控件的串口通信 目前,利用 Delphi实现串口通信的常用的方法有 3种:一是利用控件,如 MSCOMM控件和 SPCOMM控件;二是使用 API函数;三是调用其他串口通信程序。其中利用 API编写串口通信程序较为复杂,需要掌握大量的通信知识。相比较而言,利用 SPCOMM控件则相对较简单,并且该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作,而且还支持多线程。下面本文结合实例详细介绍 SPCOMM控件的使用。 SPCOMM的安装 1.选择下拉菜单 Component中的 Install Component选项,在 Unit file name处填写 SPCOMM控件所在的路径,其他各项可用默认值,点击 OK按钮。 2.安装后,在 System控件面板中将出现一个红色控件 COM。现在就可以像 Delphi自带控件一样使用 COM控件了。 SPCOMM的属性、方法和事件 1.属性 ●CommName:表示 COM1、 COM2等串口的名字; ●BaudRate:根据实际需要设定的波特率,在串口打开后也可更改此值,实际波特率随之更改; ●ParityCheck:表示是否需要奇偶校验; ●ByteSize:根据实际情况设定的字节长度; ●Parity:奇偶校验位; ●StopBits:停止位; ●SendDataEmpty:这是一个布尔型属性,为 true时表示发送缓存为空,或者发送队列里没有信息;为 false时表示发送缓存不为空,或者发送队列里有信息。 2.方法 ●Startcomm方法用于打开串口,当打开失败时通常会报错。错误主要有 7种:⑴串口已经打开;⑵打开串口错误;⑶文件句柄不是通信句柄;⑷不能够安装通信缓存;⑸不能产生事件;⑹不能产生读进程;⑺不能产生写进程; ●StopComm方法用于关闭串口,没有返回值; ●WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word )方法是个带有布尔型返回值的函数,用于将一个字符串发送到写进程,发送成功返回 true,发送失败返回 false。执行此函数将立即得到返回值,发送操作随后执行。该函数有两个参数,其中 pDataToWrite是要发送的字符串, dwSizeofDataToWrite是发送字符串的长度。 3.事件 ●OnReceiveData :procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object 当有数据输入缓存时将触发该事件,在这里可以对从串口收到的数据进行处理。 Buffer中是收到的数据, BufferLength是收到的数据长度。 ●OnReceiveError : procedure(Sender: TObject; EventMask : DWORD) 当接收数据出现错误时将触发该事件。 [此贴子已经被作者于2004-05-09 08:40:28编辑过] [img]http://www.lvsky.com/bbs/UploadFile/2005-3/2005320191459674.gif
[/img] 2004-5-7 8:31:00 yangguofa 来自:黑马王子 等级:业余侠客 文章:360 积分:27114 注册:2004年5月5日 第 2 楼 QQ SPCOMM的使用 下面是一个利用 SPCOMM控件的串口通信的例子。 以实现 PC机与单片机 8051之间的通信为例,首先要调通它们之间的握手信号。假定它们之间的通信协议是: PC到 8051一帧数据 6个字节, 8051到 PC一帧数据也为 6个字节。当 PC发出( F0,01,FF,FF,01,F0)后 8051能收到一帧( F0,01,FF,FF,01,F0),表示数据通信握手成功,两者之间就可以按照协议相互传输数据。 创建一个新的工程 COMM.DPR,把窗体的 NAME属性定为 FCOMM,把窗体的标题定义为测试通信,添加相应的控件。 1.设定 COMM1属性: ●波特率: 4800; ●奇偶校验位:无; ●字节长度: 8; ●停止位: 1; ●串口: COM1。 Memo1中将显示发送和接收的数据。将新的窗体存储为 Comm.pas。 2.编写源代码 //变量说明 var fcomm: TFCOMM; viewstring:string; i:integer; rbuf,sbuf:array[16] of byte; //打开串口 procedure TFCOMM.FormShow(Sender: TObject); begin comm1.StartComm; end; //关闭串口 procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction); begin comm1.StopComm; end; //自定义发送数据过程 procedure senddata; var i:integer; commflg:boolean; begin viewstring:=‘’ ; commflg:=true; for i:=1 to 6 do begin if not fcomm.comm1.writecommdata(@sbuf,1) then begin commflg:=false; break; end; //发送时字节间的延时 sleep(2); viewstring:=viewstring+ inttohex(sbuf,2)+‘’ ; end; viewstring:=‘发送’+ viewstring; fcomm.memo1.lines.add(viewstring); fcomm.memo1.lines.add(‘’ ); if not commflg then messagedlg(‘发送失败 !’ ,mterror,[mbyes],0); end; //发送按钮的点击事件 procedure TFCOMM.Btn_sendClick(Sender: TObject); begin sbuf[1]:=byte($ f0); //帧头 sbuf[2]:=byte($ 01); //命令号 sbuf[3]:=byte($ ff); sbuf[4]:=byte($ ff); sbuf[5]:=byte($ 01); sbuf[6]:=byte($ f0); //帧尾 senddata;//调用发送函数 end; //接收过程 procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); var i:integer; begin viewstring:=‘’ ; move(buffer^,pchar(@rbuf^),bufferlength); for i:=1 to bufferlength do viewstring:=viewstring+ inttohex(rbuf,2)+‘’ ; viewstring:=‘接收’+ viewstring; memo1.lines.add(viewstring); memo1.lines.add(‘’ ); end;
Delphi 中TMsComm控件使用指南
作者:不详 来源:code173.com收集整理 发布时间:2005-9-3 0:15:07 发布人:admin 减小字体
增大字体
颜色 Delphi 中TMsComm控件使用指南
? 注册TMsComm控件
1.将Mscomm.srg, Mscomm32.ocx,Mscomm32.dep三个文件复制到系统文件夹中C:\\winnt\\system32\\。
2.用Windows下的注册工具regsvr32注册该OCX控件,点击“开始”->\运行\,再在中填入(假设操作安装在C盘,WIN2000):
Regsvr32 C:\\winnt\\system32\\Mscomm32.ocx
3.在注册表中手工新建一个主键项:先在点击“开始”->\运行\,再在中填入regedit命令打开注册表,找到HKEY_CLASSES_ROOT\\Licenses,在其中添加主键
4250E830-6AC2-11cf-8ADB-00AA00C00905 并将内容设置为:
kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun
? 引入TMSComm控件
(1)进入Delphi 编程环境下,在菜单项中选中Component/Import ActiveX选项,出现ActiveX控件导入窗口;
(2)在其中选中Microsoft Comm Control 6.0(Version 1.1),并按需要选定Palette pages、unit dir name、Search path值(一般取默认值),最后选择Install按钮进行安装。即可将MSComm控件引入到Delphi 中。 (3)在编程使用中,直接打开ActiveX控件,选取TMSComm控件,放在窗体上,设置其属性即可。其使用方法与Delphi其它控件相同.
? TMSComm控件的主要属性及事件
MSComm控件有27个属性,其中一部分可缺省设置为不用,常用的属性如下:
(1) CommPort:设置串行口选择。缺省值为1,选择为COM1;若赋值为2,则选择COM2。
(2) PortOpen:设置通信端的状态。设置为True时,打开端口;设置为False时,关闭端口并清除接受和发送缓冲区。
(3) Settings:设置通信时的波特率、奇偶校验、停止位参数。
(4) Inputlen:设置每次从接受缓冲区读却的字符个数。缺省值为0,表示将读取接受缓冲区中全部内容;若设置值为n,表示每次将读取接受缓冲区中的n个字符。 (5) InputMode:设置接收数据的类型。
(6) InBufferCount:设置返回接受缓冲区中等待被读取的字符个数。初始化程序时,InBufferCount设置值为0,表示清除接受缓冲区。
(7) OutBufferCount:设置返回发送缓冲区中等待发送的字符个数。设置值为0时,表示清除发送缓冲区。
(8) InBufferSize:设置接受缓冲区中的长度,缺省值为1024字节。 (9) OutBufferSize:设置发送缓冲区中的长度,缺省值为512字节。
(10) Rthreshold:设置表示在触发OnComm事件之前接收缓冲区允许有的字符数。缺省值为0,表示即使接收缓冲区有字符时,也不会触发OnComm事件;设置值为n时,表示接收缓冲区每有n个字符时,就会触发一次OnComm事件。
(11) Sthreshold:设置表示在触发OnComm事件之前发送缓冲区允许有的字符数。缺省值为0,表示不触发OnComm事件;设置值为n时,表示发送缓冲区每有n个字符时,就会触发一次OnComm事件。 (12) DTREnable:设置DTR的有效性。 (13) RTSEnable:设置RTS的有效性。 (14) Input:从串口读取数据。 (15) Output:向串口写入数据。
如果在通信过程中发生错误或事件,就会触发OnComm事件,并由CommEvent属性代码反映错误类型,在通信程序的设计中可根据该属性值来执行不同的操作。CommEvent属性值及其含义如下: (1)ComEvSend:值为1,发送缓冲区的内容少于SThreshold指定的值。
(2)ComEvReceive:值为2,接收缓冲区内字符数达到RThreshold指定的值。 (3)ComEvFrame:值为1004,硬件检测到帧错误。 (4)ComEvRxOver:值为1008,接收缓冲区溢出。 (5)ComEvTxFull:值为1010,发送缓冲区溢出。 (6)ComEvRxParity:值为1009,奇偶校验错误。
(7)ComEvEOF:值为7,接收数据中出现文件尾(ASCII码为26)字符
(8) InBufferSize:设置接受缓冲区中的长度,缺省值为1024字节。 (9) OutBufferSize:设置发送缓冲区中的长度,缺省值为512字节。
(10) Rthreshold:设置表示在触发OnComm事件之前接收缓冲区允许有的字符数。缺省值为0,表示即使接收缓冲区有字符时,也不会触发OnComm事件;设置值为n时,表示接收缓冲区每有n个字符时,就会触发一次OnComm事件。
(11) Sthreshold:设置表示在触发OnComm事件之前发送缓冲区允许有的字符数。缺省值为0,表示不触发OnComm事件;设置值为n时,表示发送缓冲区每有n个字符时,就会触发一次OnComm事件。 (12) DTREnable:设置DTR的有效性。 (13) RTSEnable:设置RTS的有效性。 (14) Input:从串口读取数据。 (15) Output:向串口写入数据。
如果在通信过程中发生错误或事件,就会触发OnComm事件,并由CommEvent属性代码反映错误类型,在通信程序的设计中可根据该属性值来执行不同的操作。CommEvent属性值及其含义如下: (1)ComEvSend:值为1,发送缓冲区的内容少于SThreshold指定的值。
(2)ComEvReceive:值为2,接收缓冲区内字符数达到RThreshold指定的值。 (3)ComEvFrame:值为1004,硬件检测到帧错误。 (4)ComEvRxOver:值为1008,接收缓冲区溢出。 (5)ComEvTxFull:值为1010,发送缓冲区溢出。 (6)ComEvRxParity:值为1009,奇偶校验错误。
(7)ComEvEOF:值为7,接收数据中出现文件尾(ASCII码为26)字符
正在阅读:
感恩母校的优秀诗歌03-21
速冻调理食品10-19
安全技术措施(停送电2016)09-23
还款保证书07-05
工程施工管理经验交流发言稿02-26
大学物理 第二章 课件05-03
大海的诉说作文400字06-23
教师招聘考试试题及答案08-20
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 串口
- 中用
- 编程
- 实现
- Delphi
- SPCOMM