DELPHI串口通讯编程

spcomm更加简单  
  转贴  
  Delphi中串口通信的实现  
   
  河南省计算中心   张海航    
   
  --------------------------------------------------------------------------------  
     
   
  Delphi是一种具有功能强大、简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选择   Delphi作为开发工具编制各种应用程序。但是,美中不足之处是   Delphi没有自带的串口通信控件,在它的帮助文档里也没有提及串口通信,这就给编制通信程序的开发人员带来许多不便。      
     
  目前,利用   Delphi实现串口通信的常用的方法有   3种:一是利用控件,如   MSCOMM控件和   SPCOMM控件;二是使用   API函数;三是调用其他串口通信程序。其中利用   API编写串口通信程序较为复杂,需要掌握大量的通信知识。相比较而言,利用   SPCOMM控件则相对较简单,并且该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作,而且还支持多线程。下面本文结合实例详细介绍   SPCOMM控件的使用。      
     
  SPCOMM的安装      
     
  1.选择下拉菜单   Component中的   Install   Component选项,弹出如图   1所示的窗口。      
     
     
  图   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;   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[i],1)   then      
     
  begin      
     
  commflg:=false;      
     
  break;      
     
  end;      
     
  //发送时字节间的延时      
     
  sleep(2);      
     
  viewstring:=viewstring+   inttohex(sbuf[i],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[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,这表示串口已正确地发送出数据并正确地接收到数据,则串口通信成功。

转载于:https://www.cnblogs.com/shylock/archive/2008/11/02/1325101.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式C++实现 ——观察者模式

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。它还有两个别名,依赖(Dependents),发布-订阅(Publish-Subsrcibe)。可以举个博客订阅的例子&…

【转】DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)

转自:https://blog.csdn.net/zssureqh/article/details/8784980 DCMTK开源库介绍: DCMTK是目前最全面实现DICOM3.0标准的开源库,通过结合DCMTK开源库和CxImage图像开源库,能够很方便的开发属于自己的DCM文件编辑浏览软件。 DCMT…

如何将C语言翻译成汇编语言,如何把汇编语言转换成C语言

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼程序:ORG 0000HLJMP MAINORG 000BHLJMP TIMEORG 1000HHOUR1 EQU 10hHOUR2 EQU 12hMIN1 EQU 14hMIN2 EQU 16hSEC1 EQU 18HCOUNT EQU 20HNUM1 EQU 22HNUM2 EQU 24HLL4 EQU 26Hs1 bit P1.0s2 bit P1.1s3 bit P1.2s4 bit P1.3A1 EQU 36…

数据库-Oracle【Oracle数据库设置默认表空间问题及Oracle,SQL,MySQL的自增变量设置】...

一、 Oracle数据库设置默认表空间问题 DBA们经常会遇到一个这样令人头疼的问题:不知道谁在Oracle上创建了一个用户,创建时,没有给这个用户指定默认表空间,所以这个用户就会采用默认的表空间——system表空间。导致系统表空间迅速被…

设计模式——Iterator模式实现研究

导读:软件设计模式是一种表达、记录和重用软件设计结构和设计经验的新方法,它对反复出现的设计结构的关键特征进行识别、抽象和命名,使重用成功设计和结构更加容易。本文介绍了软件设计模式的特点、描述方式以及在设计中使用模式带来的好处&a…

【转】DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试

转自:https://blog.csdn.net/zssureqh/article/details/8785132 DCMTK官网给出了JPEG格式压缩的DCM文件解压缩的方法(http://support.dcmtk.org/docs/mod_dcmjpeg.html),代码摘录如下: DJDecoderRegistration::regist…

R语言处理非线性回归模型C-D方程,使用R语言进行多项式回归、非线性回归模型曲线拟合...

对于线性关系,我们可以进行简单的线性回归。对于其他关系,我们可以尝试拟合一条曲线。曲线拟合是构建一条曲线或数学函数的过程,它对一系列数据点具有最佳的拟合效果。使用示例数据集#我们将使Y成为因变量,X成为预测变量#因变量通…

认识IL

1.要编译的代码如下: using System; using System.Collections.Generic; using System.Text; namespace HellowWorld { class Program { static void Main() { Console.Write("Hello World!"); } } } 2…

c语言之多线程函数,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统,C语言实现多线程:#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦,参数是:%s\n" , (char *)threadArg );return …

Iterator模式

Iterator模式的几种用法 在网络上看帖子时发现不少模式的初学者对Iterator模式的理解仅仅停留在从类库的容器类取得Iterator来遍历容器中的内容的程度。 因此在这里写几个例子,来加深大家对Iterator模式的理解。 对容器中元素的访问涉及到3个方面。 1.容…

【转】DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改

转自:https://blog.csdn.net/zssureqh/article/details/8804736 dcm文件是医学领域DICOM3.0标准所对应的主要的文件格式。前两篇学习笔记中,学习了读取dcm文件的相关信息,如信息头MetaInformation元素、像素数据元素,只停留在了读…

设计模式C++实现 —— 外观模式、组合模式

外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来。客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构。DP一书的定义&…

rsync的原理和安装使用及配制详解(三)(转)

5、示例脚本 这里这些脚本都是rsync网站上的例子: 1、每隔七天将数据往中心服务器做增量备份 #!/bin/sh# This script does personal backups to a rsync backup server. You will end up# with a 7 day rotating incremental backup. The incrementals will go# in…

单片机c语言控制显示器,单片机实现LCD液晶显示器控制原理..docx

摘 要LCD液晶显示已经是人机界面的关键技术。 本文对基于单片机的LCD夜晶显示器 控制系统进行了研究。首先在绪论中介绍了本课题的课题背景、 研究意义及完成的功能。本系统是以单 片机的基本语言C语言来进行软件设计,51的编程语言常用的有二种,一种是汇…

【转】DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档

转自:https://blog.csdn.net/zssureqh/article/details/8846337 背景介绍: 医学影像PACS工作站的服务端需要对大量的dcm文件进行归档,写入数据库处理。由于医学图像的特殊性,每一个患者(即所谓的Patient)…

linux ( )含义,Linux的shell中$()、$[] 、${}分别是什么意思?

在bash中,$( )与 (反引号)都是用来作命令替换的。命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。exp 1[rootlocalhost ~]# echo today is $(date &q…

导师评语(转)

星期一到了……小英在交完作业後,中午马上被老师叫去罚站,附加念500遍「我以後不敢编谎话欺骗老师了」。 why?为何这名老师要残忍的对待这名柔弱的小学生?我们来瞧瞧她的作文是怎麽写的…… ━━━━━━━━━━━━━━━━━━…

VxWorks平台下计算cpu的利用率

1、VxWorks的spyLib库提供的spy工具的实现原理。 Spy利用辅助定时器来产生中断,并且为每个任务维护一个计数器。然后记下被中断的任务,并且将该任务的计数器加一。经过一段时间后,每个任务的计数器反映了该任务占用CPU利用率的情况。很明显&a…

【转】DCMTK开源库类继承结构与DICOM3.0标准元素定义的对应关系图

转自:https://blog.csdn.net/zssureqh/article/details/9275271 最近由于课题需要,拿出来一些时间阅读了下DICOM3.0标准。在处理相关的DCM医学图像时使用了DCMTK开源库,废话不多说,直接贴图: 图一:DCMTK开…

c语言中用简易暗纹来输入密码,确定夫琅和费单缝衍射明、暗纹位置的不同教学方法的讨论...

崔红玲苏向英摘要:夫琅和费单缝衍射的明、暗纹位置及相应光强是波动光学中的重要部分,用不同的方法讲解效果不同。本文比较了惠更斯-菲涅耳原理定量积分法及半波带法得到的结论,表明在近似情况下,这两种方法都可以对其进行描述。关…