用户登陆 用户注册
您的位置:首页> 技术文章>内容正文
如何用Delphi开发串口通信程序
[正文]:本文对在delphi中使用activex控件,使用行间汇编,用delphi调用可执行应用程序三种方法实现串口通信进行了阐述。
不过在delphi中进行串口编程并不象作者所说的那样令人头疼,我就知道几个很好用的串口程序是用delphi编写的(我不太会用delphi)。
delphi 是新一代可视化开发工具,它具有功能强大、简便易用和代码执行速度快等特点,delphi系列开发工具在国际各媒体上曾获得过三十多项大奖,是全球公认的快速应用开发工具技术的先驱者,他越来越在构架企业信息系统方面发挥着重要作用。
它的功能很强大,但在对串口通信的控制上delphi的帮助文档和其他书籍中很少提及,可这是在开发应用系统时会经常遇到却又令人头痛的事情。
下面介绍三种解决方案,以实现接收和发送数据的功能。
一、 使用activex控件由于delphi中没有串口控件可用,所以首先需要把activex控件mscomm加到元件选项板上。
这是一个非常好的控件它不仅能对串口进行操作,而且还可以对modem进行控制。
下面结合一个具体的实例来说明如何用mscomm控件开发出串口通信程序。
创建一个communication.dpr工程,把窗体的name属性变为commform,将标题改为the communication test,选择file/save as将新的窗体存储为commfrm.pas,接下来将控件添加到主窗体中。
通过设置页可选定进行数据传输的通信端口和端口的波特率、奇偶校验、数据位和停止位,通信时每传输一个字符都将触发响应事件,在通信页“传输显示”位置可看到当前正在进行传输的数据。
同时当出现回车换行符时将整行内容显示在memdisplay新的一行中,而全部接收的内容还将存在一个文件中。
部分源代码如下:变量说明varcommform: tcommform;ss :string;savef,readf :file of char;i,j :longint;初始化procedure tcommform.formcreate(sender: tobject);beginmscomm.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);beginif mscomm.portopen thenmscomm.portopen:=false;mscomm.commport:=strtoint(edtcommport.text);mscomm.settings:=edtcommsetting.text;end;传输事件procedure tcommform.mscommcomm(sender: tobject);varfilenrc :char;buffer :variant;s1:string;c :char;begincase mscomm.commevent 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:=s1[1];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中又允许使用行间汇编那么来看一下怎样使用行间汇编接收下位机传来的数据,在下面的例子中我们简化了问题,比如我们通过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;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;ca[i]:=c;i:=i+1;end;assignfile(f1,'aaa.dat');rewrite(f1);for j:=1 to i-1 dowrite(f1,ca[j]);closefile(f1);label1.caption:='receive end';end;三、用delphi调用可执行应用程序采用其它编程技术编制的串口通信程序在完成数据传输后将数据保存到磁盘上,然后用delphi对数据内容进行处理。
通过在delphi中与其他编程技术协同工作也不失为一种解决问题的好方法。
 


网站首页 培训课程 维修指南
技术文章 家电专栏 供应信息
求购信息 培训资讯 展会信息
电脑专栏 教程下载 资料下载
常用软件 PLC教程 PLC资料
变频伺服 低压电器 维修资料
人机界面 自控仪表 工控机类
文章标题: 搜文章
中国工控资源网手机版 2012
电话:010-67577139 13811659603
培训咨询QQ:657167934 471895637 销售咨询QQ:623769457
联系邮箱:zggkzyw@163.com
 京ICP备11002135号
报时(2026-04-03 09:33:50) 流量统计