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
不一样,不知道咋回事
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
不一样,不知道咋回事
解决方案 »
- ping不通却可以链接???
- 100分求一个离线浏览器源代码
- 古怪问题敬请高手以求解答,本人不甚感激(百思不得其解)
- 关于Delphi的Unit:Printers的问题!
- 今天急着发布程序,哪位老兄提供一下好的软件保护加密方法啊 ?????在线等!
- 毕业设计遇到问题,紧急求救!
- 如何用delphi5实现交叉报表的生成?
- 点击dbnavigator使dbgrid数据显示到dbedit
- 如何让自己的补丁程序自动完成他的使命!!
- 请问我在第一个窗体中单击button按纽怎么能弹出第二个窗体(form2),怎么设置谢谢
- 关于Delphi7的FastReport控件的问题
- delphi如何使用.output 备份slqite数据库?
FreeMem(lBuf,x);