var
  str,lstr: string;
  buffer: pointer;
  BufferLength,k: integer;
  res: integer;
begin
  str := '';
  lstr := '';
  str := SdpoSerial8DI.ReadData(buffer,BufferLength);
  if str <> '' then
  begin
    Memo1.Lines.add(str);
    for k := 0 to BufferLength-1 do
      lstr := lstr + IntToHex(ord((pchar(integer(buffer)+k))^),2) + ' ';
    Memo1.Lines.add(lstr);
  end;
end;  
传进去的指针是buffer长度是BufferLength
调用函数是str := SdpoSerial8DI.ReadData(buffer,BufferLength);function TBlockSerial.RecvPacket(Timeout: Integer;var buffer: pointer;var length: integer): string;
var
  x,k: integer;
  lbuf: pointer;
  nRcv: Integer;
  hexBuf:array of byte;
begin
  Result := '';
  if PreTestFailing then   {HGJ}
    Exit;                  {HGJ}
  SetSynaError(sOK);
  if FBuffer <> '' then
  begin
    Result := FBuffer;
    FBuffer := '';
  end
  else
  begin
    //not drain CPU on large downloads...
    Sleep(0);
    x := WaitingData;
    if x > 0 then
    begin
      lbuf := nil;
      Getmem(lBuf,x);
      try
      Result := '';
      nRcv := RecvBuffer(lbuf, x);
      buffer := lbuf;
    //  nRcv := RecvBuffer(Pointer(Result), x);
      if nRcv<>x then
       begin
         exit;
       end;
      x := nRcv;
      length := x;
      if lbuf <> nil then
       begin
        //move(lbuf^,hexbuf[0],x);
        //Integer(hexBuf) := integer(lBuf);
        for k := 0 to x-1 do
          Result := Result + IntToHex(ord((pchar(integer(lbuf)+k))^),2) + ' ';       end;
      //if x >= 0 then
        //SetLength(Result, x);
      finally
        FreeMem(lBuf,x);
      end;
    end
    else
    begin
      if CanRead(Timeout) then
      begin
        x := WaitingData;
        if x = 0 then
          SetSynaError(ErrTimeout);
        if x > 0 then
        begin
          SetLength(Result, x);
          x := RecvBuffer(Pointer(Result), x);
          if x >= 0 then
            SetLength(Result, x);
        end;
      end
      else
        SetSynaError(ErrTimeout);
    end;
  end;
  ExceptCheck;
end;    取得指针是和长度是buffer := lbuf;
                  length := x;里面的函数取得的结构输出是用指针lbuf
   for k := 0 to x-1 do
          Result := Result + IntToHex(ord((pchar(integer(lbuf)+k))^),2) + ' ';
外面的函数取得的结构输出是用指针buffer 
   for k := 0 to BufferLength-1 do
      lstr := lstr + IntToHex(ord((pchar(integer(buffer)+k))^),2) + ' ';
前面输出:55 AA 55 AA 21 00 86 0B 00 00 00 00 00 00 00 00 00 00 FF 00 
后面输出:F4 D3 E5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 
不一样,不知道咋回事