⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~pas

📁 SPCOMM控件使用,主要是用在PC串口通信.
💻 ~PAS
字号:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Comm1: TComm;
    Timer1: TTimer;
    Edit1: TEdit;
    Label1: TLabel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    Memo1: TMemo;
    BitBtn5: TBitBtn;
    Edit2: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);

    procedure senddata;
    procedure BitBtn5Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

Viewstring:string;

i,cont:integer;

rbuf,sbuf:array[1..6] of byte;  

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Timer1.Interval := strtoint(Edit1.Text);
{
sbuf[1]:=byte($f0); //帧头

sbuf[2]:=byte($01); //命令号

sbuf[3]:=byte($ff);

sbuf[4]:=byte($ff);

sbuf[5]:=byte($01);

sbuf[6]:=byte($0f); //帧尾
}



//senddata;{调用发送函数}

Timer1.Enabled := true;

  BitBtn2.Enabled := not BitBtn2.Enabled;
  BitBtn1.Enabled := false;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  Timer1.Interval := 0;

  BitBtn2.Enabled := false;
  BitBtn1.Enabled := not BitBtn2.Enabled;

end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
{
SPCOMM 控件的属性设置很关键的,特别是使用事件驱动时接收大块数据时尤为明显,如果设置不当,接收到的数据可能严重出错。根据本人经验,要注意事项如下:
ReadIntervalTimeout:=100
SPCOMM 属性时,所有 可设置 True 和 False 的属性应当设置成 False;
在接收数据时,应注意适当设置延时,见以下代码:

procedure TCKFRM.SPCOMReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);

var
TXT:string;
I,L:INTEGER;
RBUF:ARRAY[0..2048] of BYTE;
begin
  Move(Buffer^, pchar(@rbuf)^, BufferLength); //接收RS232的数据并显示Memo1上。
  L:=BufferLength;
  FOR I:=0 TO L-1 DO BEGIN
  TXT:=TXT+INTTOHEX(RBUF[I],2);
  END;
  //READDATA.TEXT:=TXT;

  //SPCOMM 控件每次只能接收 2048 个字节,如果大于 2048 个字节,则分多次接收.
}

var

i:integer;

begin

viewstring:='';

move(buffer^,pchar(@rbuf)^,bufferlength);

for i:=1 to bufferlength do
    viewstring:=viewstring+inttohex(rbuf[i],2)+'|';


viewstring:='共计:'+inttostr(bufferlength)+'字节, 接受: '+viewstring+#13#10;

viewstring:=viewstring+'本次接收完毕!' ;

memo1.lines.add(viewstring);

//memo1.lines.add("");


end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
  Comm1.CommName:=trim(Edit2.Text);
  Comm1.StartComm;

  Label4.Visible:= true;


end;

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
  Comm1.StopComm;
  Label4.Visible:= false;
end;


procedure TForm1.senddata;
var

i:integer;

commflg:boolean;

begin

//viewstring:="";

commflg:=true;

//for i:=1 to 6 do
for i:=1 to 1 do

begin

if not Form1.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 TForm1.BitBtn5Click(Sender: TObject);
begin
  memo1.lines.Clear;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin

  inc(cont);
  if cont>=10 then
     begin
       cont:=0;
       Timer1.Interval:=0;
       exit;
     end;

  if (cont mod 2)=0 then
     sbuf[1]:=byte($05)
  else
     sbuf[1]:=byte($06);

senddata;{调用发送函数}

end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -