在Delphi中用SPCOMM实现串口编程(3)

2019-03-22 17:24

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中与其他编程技术协同工作也不失为一种解决问题的好方法。


在Delphi中用SPCOMM实现串口编程(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:员工出差管理制度

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: