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

DELPHI串口编程剖析 1 第一章 背景知识 3 1. 概述 3 2. 什么是接口? 3 3. 接口分类. 3 4. 为什么需要I/O接口? 3 5. I/O接口的功能 4 6. I/O接口的通信方式 5 7. I/O接口的分类 5 8. 串口的分类 8 9. 串口通信分类 11 10. 奇偶校验 12 第二章 串口通信编程简介 13 1. 串口的通信编程流程 13 2. Unix平台下对串口进行开发的方法 13 3. Windows平台下对串口进行开发的方法 13 第三章 使用DELPHI工具进行串口通信编程 15 第四章 串口编程的调试及其相关工具 27 串口通信编程剖析 第一章 背景知识 1. 概述 串口是计算机上I/O接口的一种,要掌握串口通信编程的相关知识,必须先了解I/O接口的相关知识。 I/O接口是接口的一种。 2. 什么是接口? 众所周知计算机是由CPU,存储器,外部终端设备组成. 接口就是用于CPU与外部设备、存储器的连接和数据交换的设备。 3. 接口分类. 广义的计算机接口有二种,见下表: 类別 用途 电路实现复杂性 存储器接口: 用于CPU与外部设备、存储器的连接 简单 I/O接口 数据交换 复杂 习惯上说到接口只是指I/O接口。本文沒作特別介绍的地方都叫I/O接口. 4. 为什么需要I/O接口? 计算机的外围设备品种繁多,几乎都采用了机电传动设备,因此,CPU在与I/O设备进行数据交换时存在以下问题: 速度不匹配: I/O设备的工作速度要比CPU慢许多,而且由于种类的不同,他们之间的速度差异也很大,例如硬盘的传输速度就要比打印机快出很多。 时序不匹配: 各个I/O设备都有自己的定时控制电路,以自己的速度传 输数据,无法与CPU的时序取得统一。 信息格式不匹配: 不同的I/O设备存储和处理信息的格式不同,例如可以分为串行和并行两种;也可以分为二进制格式、ACSII编码和BCD编码等。 信息类型不匹配: 不同I/O设备采用的信号类型不同,有些是数字信号,而有些是模拟信号,因此所采用的处理方式也不同。    基于以上原因,CPU与外设之间的数据交换必须通过I/O接口来完成。 5. I/O接口的功能 通常I/O接口有以下一些功能: 1)设置数据的寄存、缓冲逻辑,以适应CPU与外设之间的速度 差异,接口通常由一些寄存器或RAM芯片组成,如果芯片足够大还可以实现批量数据的传输; 2)能够进行信息格式的转换,例如串行和并行的转换; 3)能够协调CPU和外设两者在信息的类型和电平的差异,如电平 转换驱动器、数/模或模/数转换器等;    4)协调时序差异;    5)地址译码和设备选择功能;    6)设置中断和DMA控制逻辑,以保证在中断和DMA允许的情况下产生中断和DMA请求信号,并在接受到中断和DMA应答之后完成中断处理和DMA传输。    6. I/O接口的通信方式 CPU通过接口对外设进行控制的方式有以下几种: 1)程序查询方式 这种方式下,CPU通过I/O指令询问指定外设当前的状态,如果外设 准备就绪,则进行数据的输入或输出,否则CPU等待,循环查询。 这种方式的优点是结构简单,只需要少量的硬件电路即可,缺点是由 于CPU的速度远远高于外设,因此通常处于等待状态,工作效率很 低。 2)中断处理方式 在这种方式下,CPU不再被动等待,而是可以执行其他程序,一旦 外设为数据交换准备就绪,可以向CPU提出服务请求,CPU如果响 应该请求,便暂时停止当前程序的执行,转去执行与该请求对应的 服务程序,完成后,再继续执行原来被中断的程序。   中断处理方式的优点是显而易见的,它不但为CPU省去了查询外设 状态和等待外设就绪所花费的时间,提高了CPU的工作效率,还满 足了外设的实时要求。但需要为每个I/O设备分配一个中断请求号 和相应的中断服务程序,此外还需要一个中断控制器(I/O接口芯 片)管理I/O设备提出的中断请求,例如设置中断屏蔽、中断请求 优先级等。此外,中断处理方式的缺点是每传送一个字符都要进行 中断,启动中断控制器,还要保留和恢复现场以便能继续原程序的 执行,花费的工作量很大,这样如果需要大量数据交换,系统的性 能会很低。 3)DMA(直接存储器存取)传送方式 DMA最明显的一个特点是它不是用软件而是采用一个专门的控制 器来控制内存与外设之间的数据交流,无须CPU介入,大大提高 CPU的工作效率。   在进行DMA数据传送之前,DMA控制器会向CPU申请总线控 制 权,CPU如果允许,则将控制权交出,因此,在数据交换时, 总线控制权由DMA控制器掌握,在传输结束后,DMA控制器将 总线控制权交还给CPU。    7. I/O接口的分类 7.1. 并行接口   目前,计算机中的并行接口主要作为打印机端口,接口使用的不再是36针接头而是25针D形接头。所谓“并行”,是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,容易出错。   现在有五种常见的并口:4位、8位、半8位、EPP和ECP,大多数PC机配有4位或8位的并口,许多利用Intel386芯片组的便携机配有EPP口,支持全部IEEE1284并口规格的计算机配有ECP并口。   标准并行口4位、8位、半8位:   4位口一次只能输入4位数据,但可以输出8位数据;8位口可以一次输入和输出8位数据;半8位也可以。   EPP口(增强并行口):由Intel等公司开发,允许8位双向数据传送,可以连接各种非打印机设备,如扫描仪、LAN适配器、磁盘驱动器和CDROM 驱动器等。   ECP口(扩展并行口):由Microsoft、HP公司开发,能支持命令周期、数据周期和多个逻辑设备寻址,在多任务环境下可以使用DMA(直接存储器 访问)。   目前几乎所有的586机的主板都集成了并行口插座,标注为 Paralle1或LPT1,是一个26针的双排针插座。 7.2. 串行接口   计算机的另一种标准接口是串行口,现在的PC机一般至少有两个串行口COM1和COM2。串行口不同于并行口之处在于它的数据和控制信息是一位接一位串行地传送下去。这样,虽然速度会慢一些,但传送距离较并行口更长,因此长距离的通信应使用串行口。通常COM1使用的是9针D形连接器,而COM2有些使 用的是老式的DB25针连接器。    7.3. 磁盘接口 1)IDE接口   IDE接口也叫做ATA端口,只可以接两个容量不超过528M的硬盘驱动器,接口的成本很低,因此在386、486时期非常流行。但大多数IDE接口不支持DMA数据传送,只能使用标准的PCI/O端口指令来传送所有的命令、状态、数据。几乎所有的586主板上都集成了两个40针的双排针IDE接口插座,分别标注为IDE1和IDE2。 2)EIDE接口 EIDE接口较IDE接口有了很大改进,是目前最流行的接口。 首先,它所支持的外设不再是2个而是4个了,所支持的设备除了硬盘,还包括CD-ROM驱动器磁盘备份设备等。   其次,EIDE标准取消了528MB的限制,代之以8GP限制。   第三,EIDE有更高的数据传送速率,支持PIO模式3和模式4标准。    7.4. SCSI接口   SCSI(SmallComputerSystemInterface)小计算机系统接口,在做图形处理和网络服务的计算机中被广泛采用SCSI接口的硬盘。除了硬盘以外,SCSI接口还可以连接CD-ROM驱动器、扫描仪和打印机等,它具有以下特点:   *可同时连接7个外设;   *总线配置为并行8位、16位或32位;   *允许最大硬盘空间为8.4GB(有些已达到9.09GB);   *更高的数据传输速率,IDE是2MB每秒,SCSI通常可以达到5MB每秒,FASTSCSI(SCSI-2)能达到10MB每秒,最新的SCSI-3甚至能够达到40MB每秒,而EIDE最高只能达到16.6MB每秒;   *成本较IDE和EIDE接口高很多,而且,SCSI接口硬盘必须和SCSI接口卡配合使用,SCSI接口卡也比IED和EIDE接口贵很多。   *SCSI接口是智能化的,可以彼此通信而不增加CPU的负担。在IDE和EIDE设备之间传输数据时,CPU必须介入,而SCSI设备在数据传输过程中起主动作用,并能在SCSI总线内部具体执行,直至完成再通知CPU。   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值