SPCOMM的疑惑,弄了一晚上了.清各位朋友看看.清不吝赐教!! ( 积分: 0 )

  • 主题发起人 主题发起人 i_single
  • 开始时间 开始时间
I

i_single

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure Tfrm_com.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
buf:array of byte;
begin
setlength(buf,bufferlength);
move(buffer,buf,bufferlength);//数据少时(少于几百字节),正常,捎大一点就出错.
//无论怎样都出错,move(buffer^,pchar(@buf)^,bufferlength);.....
for i:=0 to bufferlength-1 do
memo1.lines.add(inttohex(buf,2));--->出错.
end;

改成这样:
procedure Tfrm_com.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
a:pchar;
begin
a:=pchar(buffer);
memo1.lines.add(string(a));//无论buffer多大,一切正常.
end;
可按16进制发送CC 04 01 00 01 01 02 00 00 03 05 00 01 03 04 DD时
接收的数据经这样处理:
for i:=1 to 18 do
showmessage(inttohex(ord(memo1.text),2));
居然是这样:
CC 04 01 0D 0A 00 00 00 16 00 00 00 F8 00 41 00 DC 02

不知哪里出问题了,清不吝赐教!!
 
procedure Tfrm_com.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
buf:array of byte;
begin
setlength(buf,bufferlength);
move(buffer,buf,bufferlength);//数据少时(少于几百字节),正常,捎大一点就出错.
//无论怎样都出错,move(buffer^,pchar(@buf)^,bufferlength);.....
for i:=0 to bufferlength-1 do
memo1.lines.add(inttohex(buf,2));--->出错.
end;

改成这样:
procedure Tfrm_com.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
a:pchar;
begin
a:=pchar(buffer);
memo1.lines.add(string(a));//无论buffer多大,一切正常.
end;
可按16进制发送CC 04 01 00 01 01 02 00 00 03 05 00 01 03 04 DD时
接收的数据经这样处理:
for i:=1 to 18 do
showmessage(inttohex(ord(memo1.text),2));
居然是这样:
CC 04 01 0D 0A 00 00 00 16 00 00 00 F8 00 41 00 DC 02

不知哪里出问题了,清不吝赐教!!
 
你用的string类型对#0,比较敏感(结束符),建议你用Byte试一下
 
To tswhq:
是用array of byte吗?
前面都通不过啊。
麻烦您给个示例,好吗?
 
这句这样写move(buffer^,buf,bufferlength);
 
to jianghuren:
buf:array of byte;

setlength(buf,bufferlength);
move(buffer^,buf,bufferlength);
这样吗? 一接收就出错了。我的接收缓存为2048,发的数据大概为32K.
 
出什么问题?
 
dataLength := ClientSocket1.Socket.ReceiveLength;
ClientSocket1.Socket.ReceiveBuf(strdata, dataLength);
这样接受
 
to jianghuren.
buf:array of byte;

setlength(buf,bufferlength);
move(buffer^,buf,bufferlength);<----到这里就出错了。

我现在用
用的是
var
c,s:string;
setlength(s,bufferlength);
move(buffer^,pchar(s)^,bufferlength);
for i:=0 to bufferlength-1 do
c:=s;
memo1.lines.add(c);
这样还是会有问题.memo1里有$#D之类的进制数啊。不好操作.

如果用string()强制转型,那里面的00就没有了。
苦啊~~~~~~~~~~
到底改怎么办.
 
收发的过程写出来看看
 
不是说了嘛!
 
后退
顶部