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