今有一函数:
function TComm.WriteCommData( pDataToWrite: PChar; dwSizeofDataToWrite: Word ): Boolean;
也就是PComm控件发送数据用的,现在要把buf:array[0..1024]of byte 中的内容发送出去用:
comm.WriteCommData(@buf,Len);Len是要发送的缓冲区长度,要把缓冲区的内容显示出来,有一个十六进制转换为字符串的函数:
//转换成十六进制字符串
Procedure TForm1.Hex2Str(Var Str: String; Hex: PByte; Len: Byte);
Var
i: Byte;
Begin
Str := '';
If Len = 0 Then
Exit;
For i := 0 To Len - 1 Do
Begin
Try
Str := Str + IntToHex(Hex^, 2) + ' ';
Finally
Inc(Hex);
End;
End;
End;
则可以调用Hex2Str(tmpStr,@buf);tmpStr是自定义的要保存缓冲区内容的字符串变量,@buf是缓冲区的首地址,现在写一个自定函数:在这个函
数中调用WriteCommData,并同时显示出缓冲区的内容,这样可以重用,缓冲区参数还是采用它原来的,这样WriteCommData可以直接调用,可是
Hex2Str调用时有一点问题,它的参数是一个动态数组,直接调用Hex2Str(s,pHex,Len)提示参数类型不匹配,仔细看一下Hex2Str的参数类型,实
际上是一个指向一个数组首地址,而SendComData的参数pHex是一个指向字符的地址,实际上它们使用的是同一个东西,只不过它们指向的类型
不一样,而在Win32 上,指针是一个32位的整型数,哪把它们强制转换为一样的指针类型不就解决了。忽然想起Delphi里有一个万能指针Pointer,
用它应该可以的,经测试,OK。
procedure TForm1.SendComData(pHex:PAnsiChar; Len: Integer);
var
s:string;
p:DWORD;
begin
p:=DWORD(pHex);
comm.WriteCommData(pHex,Len);
Hex2Str(s,Pointer(p),Len);
memRec.Lines.Add('[S]:'+s);
end;