SPCOMM控件应用

SPCOMM的主要属性,方法和事件

1.属性

CommName:填写COM1,COM2…等串口的名字,在打开串口前,必须填写好此值。
BaudRate:设定波特率9600,4800等,根据实际需要来定,在串口打开后也可更改波特率,实际波特率随之更改。
ParityCheck:奇偶校验。
ByteSize:字节长度_5,_6,_7,_8等,根据实际情况设定。
Parity:奇偶校验位
pBits:停止位
SendDataEmpty:这是一个布尔属性,为true时表示发送缓存为空,或者发送队列里没有信息;为False时表示表示发送缓存不为空,或者发送队列里有信息。

2.方法

Startcomm过程用于打开串口,当打开失败时通常会报错,错误主要有7种:
⑴串口已经打开 ;
⑵打开串口错误 ;
⑶文件句柄不是通讯句柄;
⑷不能够安装通讯缓存;
⑸不能产生事件 ;
⑹不能产生读进程;
⑺不能产生写进程;

StopComm过程用于关闭串口,没有返回值。

函数WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word ): boolean 用于发送一个字符串到写线程,发送成功返回true,发送失败返回false, 执行此函数将立即得到返回值,发送操作随后执行。函数有两个参数,其中 pdatatowrite是要发送的字符串,dwsizeofdatatowrite 是发送的长度。

3.事件

OnReceiveData : procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object
当输入缓存有数据时将触发该事件,在这里可以对从串口收到的数据进行处理。Buffer中是收到的数据,bufferlength是收到的数据长度。

OnReceiveError : procedure(Sender: TObject; EventMask : DWORD)
当接受数据时出现错误将触发该事件。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SPComm;

type
  TForm1 = class(TForm)
    Comm1: TComm;
    Memo1: TMemo;
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure senddata;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
//自定义发送数据过程
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
  i:integer;
  viewstring:AnsiString;
  rbuf:array of AnsiChar;
begin
  SetLength(viewstring,BufferLength);
  move(buffer^,PansiChar(@viewstring[1])^,bufferlength);
  memo1.lines.add(viewstring);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  comm1.StopComm;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  memo1.Text:='';
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  comm1.CommName:='COM1';
  Comm1.BaudRate:=4800;
  comm1.ByteSize:=_8;
  comm1.Parity:=None;
  comm1.StopBits:=_1;
  comm1.StartComm;
end;

procedure TForm1.senddata;
var
  i:integer;
  commflg:boolean;
  viewstring:string;
  sbuf:array[0..7] of char;
begin
  viewstring:='';
  commflg:=true;
  for i:=1 to 8 do
  begin
    if not comm1.writecommdata(@sbuf[i],1) then
    begin
    commflg:=false;
    break;
    end;
     //发送时字节间的延时
    sleep(2);
    viewstring:=viewstring+inttohex(strtoint(sbuf[i]),2)+'  ' ;
  end;
  viewstring:='发送'+ viewstring;
  memo1.lines.add(viewstring);
  memo1.lines.add('');
  if not commflg then messagedlg('发送失败 !' ,mterror,[mbyes],0);
end;

end.