现在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;

解决方案 »

  1.   

    你的流程感觉处理不好timedelay(2000,1);
        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);
      

  2.   

    SPCOMM是使用独立线程控制的,要注意哦~
      

  3.   

    数据接收是控件自己创建单独线程完成的,可是onRecieveData是在什么时候执行的,在哪个线程执行的呢?