各路高手也请多帮忙,我知道现在高手一般都不进技术区解决我们菜鸟的小问题了,但是真的很急,出此下策,实属无奈,版主手下留情...
原来贴子的问题请看: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;
郁闷死了....帮帮忙阿

解决方案 »

  1.   

    应该是动态数组的问题,你的结构中,动态数组commandData是一个指针,在这个结构中,只有一个字节的数据在该结构的连续地址里,申请内存和你的结构的其他数据在内存中不连续,所以,读缓冲写到结构中不能把数据写到你申请的地址里。
    建议你申请一个足够大的缓冲,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);
    /////////////基本的思路,没调试,你可以试试看。
      

  2.   

    我这么接受的
    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....后面的一大堆没用的数据
      

  3.   

    你发送的代码有问题。commandData指针,这样发送结构,不能把指针的内容发送出去,所以发出去的只是一个指针地址。
    发送的地方:
    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里面就容易得多了。
      

  4.   

    PTR(buf[0])^.head:=.....//这句话的意思是不是把.....(内容)放到buf[0]里面了??
    不好意思,你写的我还有些看不懂,你能给我详细讲解一下吗?
    我之所以定义结构体是因为我要传的数据属于不同的数据类型,
    比如我的CRC校验码就是word而其他的有byte类型的也可能出现char类型的
    buf:array[0..0] of char;
    这样定义没有关系嘛?
      

  5.   

    PTR(@buf[0])^.head:=.....//这句话的意思是不是把.....(内容)放到buf[0]里面了??
    ///////////////
    意思是把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;
      

  6.   

    我用定长的数组就可以正常传输,为什么动态数组不行那,难道动态数组setlength之后和静态数组差别还是那么大吗?虽然说动态数组有可能分配的内存单元不连续,但是为什么传送数据的时候会把内存地址传出去?他应该能够寻到地址的阿
      

  7.   

    动态数组是一个指针,然后申请的动态内存,和静态的有本质的差别。传送数据的时候,应该是将结构体的一块连续buffer传送出去的。