现在procedure Tmainform.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);var
i:integer;
returnstr:string;
rbuffer:array[0..Maxsize] of byte;
begin
bufferdatalen:=bufferlength;
if bufferlength<>2 then
begin
move(buffer^,(@rbuffer)^,bufferlength);
hand[0]:=rbuffer[0];
for i:=0 to bufferlength-1 do
begin
inbuffer[i]:=rbuffer[i];
end;
end;
application.ProcessMessages;
end;
===========
function TMainform.rd(chip,AddrHigh,AddrLow,dataLenHigh,dataLenLow:byte):byte;
var
i:integer;
Tbuf:array [0..10] of byte;
checksum:byte;
datalen:word;
begin
hfok:=$55;
bufferdatalen:=0;
DataLen:=DataLenHigh*256+DataLenLow;
Tbuf[0]:=$01;
Tbuf[1]:=$00;
Tbuf[2]:=$ff;
Tbuf[3]:=$01;
Tbuf[4]:=chip;
Tbuf[5]:=AddrHigh;
Tbuf[6]:=AddrLow;
Tbuf[7]:=dataLenHigh;
Tbuf[8]:=dataLenLow;
Tbuf[9]:=Tbuf[0];
for i:=1 to 8 do Tbuf[9]:=Tbuf[9] xor Tbuf[i];
comm1.WriteCommData(pchar(@Tbuf),10);
timedelay(2000,datalen+4);
if bufferdatalen>=datalen+4 then
begin
checksum:=0;
for i:=0 to datalen+3 do
begin
checksum:=checksum xor inbuffer[i];
end;
for i:=3 to datalen+3 do pt[i-3]:=inBuffer[i];
if checksum=0 then
hfok:=$99
else
hfok:=$44;
end;
result:=hfok;
end;Function TMainform.wr(chip,AddrHigh,AddrLow,dataLenHigh,dataLenLow:byte):byte;
var
i:integer;
buffer:array [0..MaxSize] of byte;
//buffer:array [0..2048] of byte; datalen:word;
begin
hfok:=$55;
bufferdatalen:=0;
DataLen:=DataLenHigh*256+DataLenLow;
buffer[0]:=$01;
buffer[1]:=$00;
buffer[2]:=$ff;
buffer[3]:=$00;
buffer[4]:=chip;
buffer[5]:=AddrHigh;
buffer[6]:=AddrLow;
buffer[7]:=dataLenHigh;
buffer[8]:=dataLenLow; for i:=0 to datalen-1 do
begin
buffer[9+i]:=pt[i];
end;
buffer[9+datalen]:=$00;
for i:=0 to datalen+8 do // to datalen+11-1
begin
buffer[datalen+9]:=buffer[datalen+9] xor buffer[i];
end;
comm1.WriteCommData(pchar(@buffer),datalen+10);
timedelay(2000,1);
if bufferdatalen>0 then
if (inbuffer[0]=$99) then
hfok:=$99
else
hfok:=$44;
result:=hfok;
end;
BufferLength: Word);var
i:integer;
returnstr:string;
rbuffer:array[0..Maxsize] of byte;
begin
bufferdatalen:=bufferlength;
if bufferlength<>2 then
begin
move(buffer^,(@rbuffer)^,bufferlength);
hand[0]:=rbuffer[0];
for i:=0 to bufferlength-1 do
begin
inbuffer[i]:=rbuffer[i];
end;
end;
application.ProcessMessages;
end;
===========
function TMainform.rd(chip,AddrHigh,AddrLow,dataLenHigh,dataLenLow:byte):byte;
var
i:integer;
Tbuf:array [0..10] of byte;
checksum:byte;
datalen:word;
begin
hfok:=$55;
bufferdatalen:=0;
DataLen:=DataLenHigh*256+DataLenLow;
Tbuf[0]:=$01;
Tbuf[1]:=$00;
Tbuf[2]:=$ff;
Tbuf[3]:=$01;
Tbuf[4]:=chip;
Tbuf[5]:=AddrHigh;
Tbuf[6]:=AddrLow;
Tbuf[7]:=dataLenHigh;
Tbuf[8]:=dataLenLow;
Tbuf[9]:=Tbuf[0];
for i:=1 to 8 do Tbuf[9]:=Tbuf[9] xor Tbuf[i];
comm1.WriteCommData(pchar(@Tbuf),10);
timedelay(2000,datalen+4);
if bufferdatalen>=datalen+4 then
begin
checksum:=0;
for i:=0 to datalen+3 do
begin
checksum:=checksum xor inbuffer[i];
end;
for i:=3 to datalen+3 do pt[i-3]:=inBuffer[i];
if checksum=0 then
hfok:=$99
else
hfok:=$44;
end;
result:=hfok;
end;Function TMainform.wr(chip,AddrHigh,AddrLow,dataLenHigh,dataLenLow:byte):byte;
var
i:integer;
buffer:array [0..MaxSize] of byte;
//buffer:array [0..2048] of byte; datalen:word;
begin
hfok:=$55;
bufferdatalen:=0;
DataLen:=DataLenHigh*256+DataLenLow;
buffer[0]:=$01;
buffer[1]:=$00;
buffer[2]:=$ff;
buffer[3]:=$00;
buffer[4]:=chip;
buffer[5]:=AddrHigh;
buffer[6]:=AddrLow;
buffer[7]:=dataLenHigh;
buffer[8]:=dataLenLow; for i:=0 to datalen-1 do
begin
buffer[9+i]:=pt[i];
end;
buffer[9+datalen]:=$00;
for i:=0 to datalen+8 do // to datalen+11-1
begin
buffer[datalen+9]:=buffer[datalen+9] xor buffer[i];
end;
comm1.WriteCommData(pchar(@buffer),datalen+10);
timedelay(2000,1);
if bufferdatalen>0 then
if (inbuffer[0]=$99) then
hfok:=$99
else
hfok:=$44;
result:=hfok;
end;
解决方案 »
- 大家好,求助一个关于数据库按时间查询的问题,谢谢
- delphi6/7 能不能在 vista 下正常运行???? 请用过 vista 的朋友发言???????????
- 关于 Excel 直接导入 Sqlserver中的问题
- 如何隐藏任务栏上自己的程序按钮?
- 哪位知道RSOP WMI Classes的namespace
- 关于dbgird数据显示问题!
- 请问上箭头和下箭头的阿斯可码是多少。
- 有没有类似strtoint的函数?可以将string转变为longint?在线等,急!
- DCOM的C/S,为什么C端运行提示'拒绝访问.,'
- 一段vb代码 翻译成delphi 求指导
- 用delphi的XMLdocument生成XML出现乱码
- 非常非常急的一个问题,请求各位大哥帮助,谢谢!
if bufferdatalen>0 then这样等了很长无畏的时间,spcomm是基于事件机制的,
所以,你应该抽那些处理,发送的代码出来,不要混在一起最简单的,设一个全局的状态参数,
如 curStatus: integer = 0;Function TMainform.wr()
begin
case curStatus
0: 发送第一步数据
1: 发送第二步数据
...
end;
end;procedure Tmainform.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
begin
rd( inbuffer);
end;
function TMainform.rd
begin
case curStatus of
1: 处理第一步应该接收的数据,根据需要,设定 inc(curStatus);
2: 处理第二步应该接收的数据,根据需要,设定 inc(curStatus);
..
1: 处理第n步应该接收的数据,根据需要,设定 curStatus := 0, 从头开始
end;只是大概给个思路,这样,你就不用每次去等 timedelay(2000,1);