看到以上的贴子,禁不住说两句。
以上说的转换全是不需要的,发送,发送的是字节流,不是字符串,也不是什么整型。
SPComm控件发送数据的函数原型:
function TComm.WriteCommData( pDataToWrite: PChar;
dwSizeofDataToWrite: Word ): Boolean;
第一个参数,表明的是缓存区的起始地址,第二个参数,说明这是这缓冲区有多大(以byte
为单位),也就是说,要发送多少个字节。
上面的讨论,是对第一个参数产生了误解,认为是个字符串指针,遇到/0就会停止,若是
这样的话,要第二个参数干啥?!
在函数WriteCommData里,第一个参数用来指明缓冲区的首地址,指针的本质就是地址,所
以,姑且把这个指针定义成字符指针PChar,若定义成其它类型,如PByte,PWORD……,甚至
TObject,TForm……,都可以。因为这些类型的本质,都是指针。
若理解了上面所说,再看看下面的程序
// .. 发送程序
procedure TForm1.OnSend(Sender : TObject);
const
szBuffer : array[0..5] of Byte={0,1,2,3,4,5}; // 16进制表示:$10,$32, $54
begin
// 发送上面定义的6个字符,注意:第一个为‘/0’;
SPComm1.WriteCommData(PChar(@szBuffer[0]), sizeof(szBuffer));
end;
// 接收程序(简单起见,假设BufferLength >= sizeof(szBuffer))
procedure TForm1.OnReceive((Sender: TObject; Buffer: Pointer;
BufferLength: Word);
const
szBuffer : array[0..5] of Byte;
p : PByte;
i: integer;
begin
p:= PByte(Buffer);
for i=0 to sizeof(szBuffer) - 1 do
begin
szBuffer:= p^; Inc(p);
end;
// 这时szBuffer的值肯定是 0,1,2,3,4,5,用16进制表示仍然是:$10,$32, $54
end;
不知上述所说可曾明白?