各路高手也请多帮忙,我知道现在高手一般都不进技术区解决我们菜鸟的小问题了,但是真的很急,出此下策,实属无奈,版主手下留情...
原来贴子的问题请看:http://community.csdn.net/Expert/topic/3831/3831514.xml?temp=.5847742
还是原来的那个问题:
我根据gzmhero大人的指点知道如何读取AData的数据了,但是不知道为什么其他之都可以,唯独commanddata无论发送的是什么,我接受道德都是空的
1、我用这句发送数据
frmMain.UDPSend.SendBuffer(DeviceIP,RemotePort,blockComm,sizeof(blockComm));
blockComm是一个数据结构,在原来的贴子里有他的定义,我的blockComm里面有一个动态数组commanddata:array of byte;我断点测试一下,无论commanddata里面的值有多少,发送的时候sizeof(blockComm)都是24,我猜想可能程序把4字节的地址当成他的size了,于是将此举改为
frmMain.UDPSend.SendBuffer(DeviceIP,RemotePort,blockComm,sizeof(blockComm)+blockComm.Command.commandLength);
但是即使是这样,我在接受段还是什么都收不到
2、附接受端的部分代码
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var blockComm,tempComm:TR;
templength:integer;
begin
AData.ReadBuffer(tempComm,AData.Size);
templength:=tempComm.Command.commandLength;
setlength(blockComm.Command.commandData,blockComm.Command.commandLength);
AData.Position:=0;
AData.ReadBuffer(blockComm,AData.Size);//此时blockComm里面的其他值都是正确的,但是commandData确实空的...
end;
郁闷死了....帮帮忙阿
原来贴子的问题请看:http://community.csdn.net/Expert/topic/3831/3831514.xml?temp=.5847742
还是原来的那个问题:
我根据gzmhero大人的指点知道如何读取AData的数据了,但是不知道为什么其他之都可以,唯独commanddata无论发送的是什么,我接受道德都是空的
1、我用这句发送数据
frmMain.UDPSend.SendBuffer(DeviceIP,RemotePort,blockComm,sizeof(blockComm));
blockComm是一个数据结构,在原来的贴子里有他的定义,我的blockComm里面有一个动态数组commanddata:array of byte;我断点测试一下,无论commanddata里面的值有多少,发送的时候sizeof(blockComm)都是24,我猜想可能程序把4字节的地址当成他的size了,于是将此举改为
frmMain.UDPSend.SendBuffer(DeviceIP,RemotePort,blockComm,sizeof(blockComm)+blockComm.Command.commandLength);
但是即使是这样,我在接受段还是什么都收不到
2、附接受端的部分代码
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var blockComm,tempComm:TR;
templength:integer;
begin
AData.ReadBuffer(tempComm,AData.Size);
templength:=tempComm.Command.commandLength;
setlength(blockComm.Command.commandData,blockComm.Command.commandLength);
AData.Position:=0;
AData.ReadBuffer(blockComm,AData.Size);//此时blockComm里面的其他值都是正确的,但是commandData确实空的...
end;
郁闷死了....帮帮忙阿
建议你申请一个足够大的缓冲,buf :array[0..MaxLen] of char;
AData.ReadBuffer(buf,AData.Size);//
把接收的数据都写入到buf中,然后再按照结构来取数据。
PTR^=TR;
PTCommand^=TCommand;
这样使用。
head:=PTR(buf[0])^.head;
commandLength:=PTCommand(buf[sizeof(char)+size(word)])^.commandLength;
SetLength(commandData,commandLength);
CopyMemory(commandData,PTCommand(buf[sizeof(char)+size(word)])^.commandData,commandLength);
/////////////基本的思路,没调试,你可以试试看。
buf:array[0..100] of byte;
AData.ReadBuffer(buf,AData.Size);
然后把数据放到memo里面看了一下发现数据是这样的(和我传出的数据对应)
88 -------- char类型的'X'
36 --------
76 -------- 这两位是crc校验没有问题
1 ------------从这里开始-------------
1
1
1
10
133
6
9
48
0
0
4
4 ----------到这里结束都是正确的数据------
236 -这个是动态数组的[0],我发送的是byte的1
214 --------------------------byte的0
0 ------byte的0,动态数组在发送端设定的4字节,但是接受到的却是3个
88....后面的一大堆没用的数据
发送的地方:
buf :array[0..MaxLen] of char;
commandData:array[0..20] of char;
PTR=^TR;
PTCommand=^TCommand;
这样使用。PTR(buf[0])^.head:=.....
PTCommand(buf[sizeof(char)+sizeof(word)])^.commandLength:=.....///////////////
CopyMemory(pchar(Integer(@TCommand(PTR(@buf[0])^.Command).commandData[0])),pChar(@commandData[0]),3);
或者
pChar(Integer(@TCommand(PTR(@buf[0])^.Command).commandData[0])+i)^:=.....
/////////等同你的blockComm.Command.commandData[i]:=set1;结构要修改如下:
apIp4:byte;
equipNumber:byte;//设备编号
answer:byte;//应答标志
commandLength:byte;//命令体长度
commandData:array of byte; //命令数据
end;--------------》
apIp4:byte;
equipNumber:byte;//设备编号
answer:byte;//应答标志
commandLength:byte;//命令体长度
commandData:array[0..0] of byte; //命令数据
end;/////////////好费劲,为什么不直接把数据写入到buf中呢,非要强制类型转换,要是在C里面就容易得多了。
不好意思,你写的我还有些看不懂,你能给我详细讲解一下吗?
我之所以定义结构体是因为我要传的数据属于不同的数据类型,
比如我的CRC校验码就是word而其他的有byte类型的也可能出现char类型的
buf:array[0..0] of char;
这样定义没有关系嘛?
///////////////
意思是把buf的首地址开始,强制转换成PTR指针结构来赋值。下面这样更清晰。
p:PTR;
p:=PTR(@buf[0]);
p^.head:=....
p^.Tail:=...////////////////////////////////////这样定义没关系,只是要一个地址,使用的时候用指针指向这个地方。C中这样用的多,因C中的指针比D中的指针用起来方便得多。传不同的类型也可以同样处理。
譬如:
buf:array[0..100] of char;
可以一个字节一个字节的将你的结构写到buf中。
Test=record
i:integer;
ch:char;
f:double;
end;--------------->>>这样直接写入,无论什么样的类型都可以写。
index:=0;
PInteger(integer(@buf[0])+index)^:=i;
inc(index,4);
pChar(integer(@buf[0])+index)^:=ch;
inc(index,1);
PDouble(integer(@buf[0])+index)^:=f;