在Delphi中用SPCOMM实现串口编程.doc





《在Delphi中用SPCOMM实现串口编程.doc》由会员分享,可在线阅读,更多相关《在Delphi中用SPCOMM实现串口编程.doc(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、先把那个comm32复制到你安装DELPHI的目录下,然后打开delphi,在tools-environment options-library-library path中,选择你刚才复制到的目录,确定! 然后再在component-install component-unit file name中,选择spcomm.pas,确定就可以了!在Delphi中用SPCOMM实现串口编程Delphi是一种具有功能强大、简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选择 Delphi作为开发工具编制各种应用程序。但是,美中不足之处
2、是 Delphi没有自带的串口通信控件,在它的帮助文档里也没有提及串口通信,这就给编制通信程序的开发人员带来许多不便。 目前,利用 Delphi实现串口通信的常用的方法有 3种:一是利用控件,如 MSCOMM控件和 SPCOMM控件;二是使用 API函数;三是调用其他串口通信程序。其中利用 API编写串口通信程序较为复杂,需要掌握大量的通信知识。相比较而言,利用 SPCOMM控件则相对较简单,并且该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作,而且还支持多线程。下面本文结合实例详细介绍 SPCOMM控件的使用。 SPCOMM的安装 1选择下拉菜 单 Component中
3、的 Install Component选项,弹出如图 1所示的窗口。 在 Unit file name处填写 SPCOMM控件所在的路径,其他各项可用默认值,点击 OK按钮。 2安装后,在 System控件面板中将出现一个红色控件 COM。现在就可以像 Delphi自带控件一样使用 COM控件了。 SPCOMM的属性、方法和事件 1.属性 CommName:表示 COM1、 COM2等串口的名字; BaudRate:根据实际需要设定的波特率,在串口打开后也可更改此值,实际波特率随之更改; ParityCheck:表示是否需要奇偶校验; ByteSize:根据实际情况设定的字节长度; Parit
4、y:奇偶校验位; StopBits:停止位; SendDataEmpty:这是一个布尔型属性,为 true时表示发送缓存为空,或者发送队列里没有信息;为 false时表示发送缓存不为空,或者发送队列里有信息。 2方法 Startcomm方法用于打开串口,当打开失败时通常会报错。错误主要有 7种:串口已经打开;打开串口错误;文件句柄不是通信句柄;不能够安装通信缓存;不能产生事件;不能产生读进程;不能产生写进程; StopComm方法用于关闭串口,没有返回值; WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word )方法是个带有布尔型
5、返回值的函数,用于将一个字符串发送到写进程,发送成功返回 true,发送失败返回 false。执行此函数将立即得到返回值,发送操作随后执行。该函数有两个参数,其中 pDataToWrite是要发送的字符串, dwSizeofDataToWrite是发送字符串的长度。 3事件 OnReceiveData :procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object 当有数据输入缓存时将触发该事件,在这里可以对从串口收到的数据进行处理。 Buffer中是收到的数据, BufferLength是收到的数据长度。 O
6、nReceiveError : 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),表示数据通信握手成功,两者之间就可以按照协议相互传输数据。 创建一个
7、新的工程 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:array16 of byte; /打开串口 procedure TFCOMM.Fo
8、rmShow(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 m1.writecommda
9、ta(sbufi,1) then begin commflg:=false; break; end; /发送时字节间的延时 sleep(2); viewstring:=viewstring inttohex(sbufi,2) ; end; viewstring:=发送 viewstring; fcomm.memo1.lines.add(viewstring); fcomm.memo1.lines.add( ); if not commflg then messagedlg(发送失败 ! ,mterror,mbyes,0); end; /发送按钮的点击事件 procedure TFCOMM.Bt
10、n_sendClick(Sender: TObject); begin sbuf1:=byte( f0); /帧头 sbuf2:=byte( 01); /命令号 sbuf3:=byte( ff); sbuf4:=byte( ff); sbuf5:=byte( 01); sbuf6:=byte( f0); /帧尾 senddata;/调用发送函数 end; /接收过程 procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); var i:integer; begin viewst
11、ring:= ; move(buffer,pchar(rbuf),bufferlength); for i:=1 to bufferlength do viewstring:=viewstring inttohex(rbufi,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开发串口通
12、信程序Delphi 是新一代可视化开发工具,它具有功能强大、简便易用和代码执行速度快等特点,Delphi系列开发工具在国际各媒体上曾获得过三十多项大奖,是全球公认的快速应用开发工具技术的先驱者,他越来越在构架企业信息系统方面发挥着重要作用。它的功能很强大,但在对串口通信的控制上Delphi的帮助文档和其他书籍中很少提及,可这是在开发应用系统时会经常遇到却又令人头痛的事情。下面介绍三种解决方案,以实现接收和发送数据的功能。一、 使用ActiveX控件由于Delphi中没有串口控件可用,所以首先需要把ActiveX控件MSCOMM加到元件选项板上。这是一个非常好的控件它不仅能对串口进行操作,而且还
13、可以对Modem进行控制。下面结合一个具体的实例来说明如何用MSCOMM控件开发出串口通信程序。创建一个Communication.dpr工程,把窗体的Name属性变为CommForm,将标题改为The Communication Test,选择File/Save As将新的窗体存储为CommFrm.pas,接下来参照图1和图2将控件添加到主窗体中。图1 图2由图1和图2我们可以看出,通过设置页可选定进行数据传输的通信端口和端口的波特率、奇偶校验、数据位和停止位,通信时每传输一个字符都将触发响应事件,在通信页“传输显示”位置可看到当前正在进行传输的数据。同时当出现回车换行符时将整行内容显示在m
14、emDisplay新的一行中,而全部接收的内容还将存在一个文件中。部分源代码如下:变量说明varCommForm: TCommForm;ss :string;savef,readf :file of char;i,j :longint;初始化procedure TCommForm.FormCreate(Sender: TObject);beginmport:=1;mscomm.settings:=9600,n,8,1;mscomm.inputlen:=1;mscomm.inbuffercount:=0;mscomm.portopen:=true;ss:=;i:=0;j:=0;assignfil
15、e(savef,save1);rewrite(savef);assignfile(readf,read1);reset(readf);end;设置确定procedure TCommForm.btnConfirmClick(Sender: TObject);beginif mscomm.portopen thenmscomm.portopen:=false;mport:=strtoint(edtCommport.text);mscomm.settings:=edtCommsetting.Text;end;传输事件procedure TCommForm.MSCommComm(Sender: TOb
16、ject);varfilenrc :char;buffer :variant;s1:string;c :char;begincase mEvent ofcomEvSend:beginwhile not(eof(readf) dobeginread(readf,filenrc);mscomm.output:=filenrc;j:=j+1;lblDisplay.caption:=inttostr(j);if mscomm.outbuffercount=2 thenbreak;end;end;comEvReceive:beginbuffer:=mscomm.Input;s1:=buffer;c:=s
17、11;ss:=ss+c;i:=i+1;lblDisplay.caption:=c+inttostr(i);write(savef,c);if (c=chr(10)or(c=chr(13) thenbeginlblDisplay.caption:=cr+inttostr(i);memDisplay.lines.add(ss);ss:=;end;end;end;end;当然还有许多串口控制的ActiveX控件,有控件用是方便,但是是否说没有控件就不能用Delphi本身解决问题呢。那么就请来看一下下面的解决方案:二、使用行间汇编对于硬件的控制,汇编语言是最方便的了,而Delphi中又允许使用行间汇编
18、那么来看一下怎样使用行间汇编接收下位机传来的数据,在下面的例子中我们简化了问题,比如我们通过COM2接收400个传来的字符并将这些内容保存在AAA.DAT文件中当接收完毕后显示Receive end。但是为什么说我们简化了问题呢,因为实际情况中双方通信可能是约定传送字符的个数,也可能约定的是规定好的起始字符和结束字符,或是多种条件同时约定待各种条件全部满足时才表示完成一次成功的接收否则如有一个条件未满足都表示接收失败需要重新传送。这些约定在使用了行间汇编的Delphi程序中都可实现。下面的程序就是按一个按钮进入的一个简化的串口接收程序。procedure TForm1.Button1Click
19、(Sender: TObject);var ca:array1.400of char;c:char;i,j:integer;f1:file of char;label loop1;begini:=1;asmmov dx,0001mov ax,005ehint 14hend;for j:=1 to 400 dobeginasmloop1: mov dx,0001mov ah,02int 14htest ah,80hjnz loop1mov c,alend;cai:=c;i:=i+1;end;assignfile(f1,aaa.dat);rewrite(f1);for j:=1 to i-1 do
20、write(f1,caj);closefile(f1);label1.caption:=receive end;end;三、用Delphi调用可执行应用程序采用其它编程技术编制的串口通信程序在完成数据传输后将数据保存到磁盘上,然后用Delphi对数据内容进行处理。通过在Delphi中与其他编程技术协同工作也不失为一种解决问题的好方法。SPCOMM控件在Delphi7.0串口通信中的应用2007年04月25日 星期三 19:01SPCOMM控件在Delphi7.0串口通信中的应用摘要:利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而串口通信是这个过程中必须解决的问题之一。本文
21、在对几种常用串口通信方法分析比较的基础上,着重讨论了Delphi开发环境下利用Spcomm控件实现PC机与单片机之间串口通信的方法,研究了Spcomm串口通信的关键技术问题,并通过一个实例给出了Spcomm控件在Delphi7.0串口通信中的应用。 关键词:串口通信;Delphi7.0;Spcomm控件 1 引言目前, 随着现代信息技术的发展,计算机串口通信技术已日趋成熟。由于微机性能价格比高、分析处理能力强、处理速度快以及单片机抗干扰能力强、使用灵活等特点,利用PC机作为上位机,单片机作为下位机的主从工作方式在工业控制领域中被广泛采用。无忧S3C2410 ARM9开发板 S3C44B0 AR
22、M7 开发板350元单片机开发系统498元无忧单片机实验开发板238元PC机与下位机的通信可以采用高级语言编程实现,如Delphi、VC等。Delphi 是新一代面向对象的可视化开发工具,它具有功能强大、简便易用和代码执行速度快等特点,越来越在构架企业信息系统方面发挥着重要作用。由于Delphi 这些显著特点,利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而实现系统监测控制和信息处理的关键是解决PC机与单片机之间的串口通信问题。2Spcomm串口通信组件简介用Delphi 实现串口通信,常用的方法有:使用控件,如Mscomm和Spcomm控件等;使用API函数;在Delph
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 中用 SPCOMM 实现 串口 编程

限制150内