var
Form1: TForm1;
rbuf,sbuf:array[1..8] of byte;
implementation{$R *.dfm}procedure TForm1.Button2Click(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); //帧尾
end;procedure TForm1.Button1Click(Sender: TObject);//发送代码
var
HSendStr,DSendStr,sendstr : string;
i : integer;
begin
for i := 1 to 6 do
begin
comm1.WriteCommData(@sbuf[i],1);
sleep(200);
sendstr := '';
sendstr:=sendstr + inttohex(sbuf[i],2)+'';
sendstr:='发送'+sendstr;
memo1.lines.add(sendstr);
memo1.lines.add('');
end;
end;procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;//接收代码
BufferLength: Word);
var
viewstring,rstr : string;
i : integer;
begin {SetLength(Rstr, BufferLength);
move(buffer^,pchar(Rstr)^,bufferlength);
for i:=0 to bufferlength do
memo1.Lines.Add(Rstr);
Memo1.Invalidate;}
viewstring := '';
move(buffer^,rbuf,bufferlength);
for i := 1 to bufferlength do
begin
//viewstring:=viewstring+ inttohex(rbuf[i],2)+'';
viewstring := viewstring + inttohex(rbuf[i],2)+'';
memo1.lines.add('接收' + viewstring);
memo1.lines.add('');
end;end;接收的显示:接收F8接收F1接收FF接收FF接收F9接收F81、为什么接收到的不是发送的?
2、发送16进制数,接收的buffer里是10进制的?不然为什么显示时要用inttohex(rbuf[i],2)?
Form1: TForm1;
rbuf,sbuf:array[1..8] of byte;
implementation{$R *.dfm}procedure TForm1.Button2Click(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); //帧尾
end;procedure TForm1.Button1Click(Sender: TObject);//发送代码
var
HSendStr,DSendStr,sendstr : string;
i : integer;
begin
for i := 1 to 6 do
begin
comm1.WriteCommData(@sbuf[i],1);
sleep(200);
sendstr := '';
sendstr:=sendstr + inttohex(sbuf[i],2)+'';
sendstr:='发送'+sendstr;
memo1.lines.add(sendstr);
memo1.lines.add('');
end;
end;procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;//接收代码
BufferLength: Word);
var
viewstring,rstr : string;
i : integer;
begin {SetLength(Rstr, BufferLength);
move(buffer^,pchar(Rstr)^,bufferlength);
for i:=0 to bufferlength do
memo1.Lines.Add(Rstr);
Memo1.Invalidate;}
viewstring := '';
move(buffer^,rbuf,bufferlength);
for i := 1 to bufferlength do
begin
//viewstring:=viewstring+ inttohex(rbuf[i],2)+'';
viewstring := viewstring + inttohex(rbuf[i],2)+'';
memo1.lines.add('接收' + viewstring);
memo1.lines.add('');
end;end;接收的显示:接收F8接收F1接收FF接收FF接收F9接收F81、为什么接收到的不是发送的?
2、发送16进制数,接收的buffer里是10进制的?不然为什么显示时要用inttohex(rbuf[i],2)?
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)+' ';
if viewstring = 'E5 ' then
j:=1;
viewstring:='接受'+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('');
end;
//接收过程 读数据
procedure TFComm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
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;
comm1.WriteCommData(@sbuf[i],1);
sleep(200);
如果sleep(1)或者没有这句。那程序只能接收到F0(应该是第一个);如果sleep(5)或者sleep(10),接收后显示为:
接收F0接收F001接收F001FF接收F001FFFF接收F001FFFF01接收F001FFFF01F0
如果sleep(200)或者更长,则显示为:
接收F0接收01接收FF接收FF接收01接收F0为什么????
procedure TForm1.Button1Click(Sender: TObject);
var
Sstr : string;
begin
sstr := edit1.Text;
comm1.WriteCommData(pchar(sstr),length(sstr));
end;procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
Rstr : string;
begin
setlength(rstr,bufferlength);
move(buffer^,pchar(rstr)^,bufferlength);
memo1.Lines.Add(rstr);
end;发送‘Edit1’,只能接收到‘E’,为什么?
var
Sstr : string;
i:integer;
begin
sstr := edit1.Text;
intlen:=len(edit1.text);
for i:=1 to intlen
comm1.WriteCommData(pchar(sstr),length(sstr));
end;
这句不是把整个字符串都发出去了吗?
pchar(sstr) 是需要发送的字符串
length(sstr) 是发送字符串的长度
var
i:integer;
begin
viewstring:='';
for i:=1 to 33 do
begin
if not fcomm.comm1.writecommdata(@sbuf[i],1) then
begin
break;
end;
//if i=7 then sleep(200); {发送时字节间的延时}
viewstring:=viewstring+inttohex(sbuf[i],2)+' ';
end;
viewstring:='发送'+viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add('');
end;
就这个啦,别再改啦
sleep(10);
应该这样吧,编译没错,可运行到这里出错。为什么?
Viewstring:string;
i:integer;
rbuf,sbuf:array[1..33] of byte;//自定义的发送过程
procedure senddata;
var
i:integer;
begin
viewstring:='';
for i:=1 to 33 do
begin
if not fcomm.comm1.writecommdata(@sbuf[i],1) then
begin
break;
end;
//if i=7 then sleep(200); {发送时字节间的延时}
viewstring:=viewstring+inttohex(sbuf[i],2)+' ';
end;
viewstring:='发送'+viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add('');
end;//发送 写数据
procedure TFComm.Btn_sendClick(Sender: TObject);
var
i,n:integer;
begin
sbuf[1]:=$68;
sbuf[2]:=$1B;
sbuf[3]:=$1B;
sbuf[4]:=$68;
sbuf[5]:=$02;
sbuf[6]:=$00;
sbuf[7]:=$6c;
sbuf[8]:=$32;
sbuf[9]:=$01;
sbuf[10]:=$00;
sbuf[11]:=$00;
sbuf[12]:=$00;
sbuf[13]:=$00;
sbuf[14]:=$00;
sbuf[15]:=$0e;
sbuf[16]:=$00;
sbuf[17]:=$00;
sbuf[18]:=$04;
sbuf[19]:=$01;
sbuf[20]:=$12;
sbuf[21]:=$0a;
sbuf[22]:=$10;
sbuf[23]:=$02;
sbuf[24]:=$00;
sbuf[25]:=$01;
sbuf[26]:=$00;
sbuf[27]:=$01;
sbuf[28]:=$84;
sbuf[29]:=$00;
sbuf[30]:=$02;
sbuf[31]:=$d0;
sbuf[32]:=$3a;
sbuf[33]:=$16;
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;