📄 unit1.~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 + -