问题:
定义一个结构体
一行数据写入一个结构体,俩行数据写入俩个同一类型结构体,八行数据写入八个结构体(都是同一结构体),然后如何把八个结构体数据累加在一起再发送(不是一条一条发送),请问如何做才能把数据累加在一块?累加时后面的数据不能覆盖前面的数据。结构体:
  VCI_CAN_OBJ=record
  ID:UINT;
  TimeStamp:UINT;
  TimeFlag:BYTE;
  SendType:BYTE;
  RemoteFlag:BYTE;
  ExternFlag:BYTE;
  DataLen:BYTE;
  Data: array[0..7]of BYTE;
  Reserved:array[0..2]of BYTE;
  end;根据listview 的checkbox来确认发几条数据(勾选一行代表一条数据,几行代表几条)
procedure TFrmCan.Button3Click(Sender: TObject);
var
  i,num,k:integer;
  SendType,FramType,FramFlag:Byte;
  ID:DWORD;
  Data:array[0..7]of Byte;
  Str,StrData:Ansistring;
  SendData:VCI_CAN_OBJ;//定义的结构体变量  lsv:TlistItem;
begin
 for i:=0 to  ListView32.Items.Count-1 do
 begin   if ListView32.Items[i].Checked then//根据listview 的checkbox来确认发几条数据
   begin
     if m_connect=0 then exit;
      SendType:=Combobox6.ItemIndex;     if listview32.Items[i].SubItems.strings[0]='标准帧'then
      FramType:=0
     else
     if listview32.Items[i].SubItems.strings[0]='扩展帧'then
      FramType:=1;     if listview32.Items[i].SubItems.strings[1]='数据帧'then
      FramFlag:=0
     else
     if listview32.Items[i].SubItems.strings[1]='远程帧'then
      FramFlag:=1;     ID:=StrToInt('0x'+listview32.Items[i].SubItems.strings[2]);
     Str:=listview32.Items[i].SubItems.strings[3];
     for k:=0 to 7 do
      begin
        StrData:=Copy(Str,3*k+1,2);
        StrData:=Trim(StrData);
        if length(StrData)=0 then
          break;
        Data[k]:=StrToInt('0x'+StrData);
      end;
      SendData.SendType:=SendType;
      SendData.ExternFlag:=FramType;
      SendData.RemoteFlag:=FramFlag;
      SendData.ID:=ID;
      SendData.DataLen:=k;
      move(Data,SendData.data,k);
          end ;
   
 end;
      if VCI_Transmit(VCI_CANET_UDP,m_devind,0,@Data,1)=1 then  //我发三条数据现在这里只能收到一条数据(一定要三条数据累加起来一起发送而不是一条一条发送)求各位大侠指导下,做不下去了
        begin

解决方案 »

  1.   

     用packed record
     将记录放在数组中 
      

  2.   

    每条数据的内容是:
    帧类型 帧格式 帧ID  数据(hex)
      

  3.   

    发送俩条数据:
    每条数据的内容是:
    帧类型  帧格式  帧ID    数据(hex) 
    标准帧  数据帧  00000   11 12 12 13 //第一条
    标准帧  数据帧  00000   22 23 24 25 //第二条需要把俩条数据累加在一块 
    {标准帧  数据帧  00000   11 12 12 13 标准帧  数据帧  00000   22 23 24 25 }然后再发送  顶顶啊
      

  4.   

    在VCI_Transmit函数具体原型可以修改的情况下,将参数1改为指针,同时增加一个说明指针内存长度的参数,在函数中计算具体的结构体数目,recordcount := len div sizeof(VCI_CAN_OBJ);
    举例发送4条
    var pdata : pbyte;
        SendData:VCI_CAN_OBJ;
    getmem(pdata,sizeof(VCI_CAN_OBJ) * 4);
    for i := 0 to 3 do
    begin
      SendData.SendType:=SendType;
      SendData.ExternFlag:=FramType;
      SendData.RemoteFlag:=FramFlag;
      SendData.ID:=ID;
      SendData.DataLen:=k;
      move(Data,SendData.data,k); 
      copymemory(pdata,@SendData,sizeof(VCI_CAN_OBJ)); 
      inc(longword(pdata),sizeof(VCI_CAN_OBJ)); 
    end;
    dec(longword(pdata),sizeof(VCI_CAN_OBJ) * 4); 
    发送,发送完毕释放
    freemem(pdata,sizeof(VCI_CAN_OBJ) * 4);
      

  5.   

    在做tcp通讯的时候 其实用不着 非得要求 一次把buf发出去 你就是连续发送几次 接收方处理正确 是没什么问题的。
    如果包比较大的时候 哪怕你把几个包一起发出去,tcp也可能给你切成几片
      

  6.   

    如果 你非要这样做 3楼的办法 可行 
    1、定义packed record
    2、将你选中的记录依次放到数组中
    3、发送的时候 buf指向数组首指针
      

  7.   

    函数改不了
    调用的是别人的dll函数
      

  8.   

    var
      SendData:VCI_CAN_OBJ;
      lsv:TlistItem;
      FF:TmemoryStream;
      arrSendData,arrSendData1:array[0..9] of VCI_CAN_OBJ;
    begin
    for i:=0 to  ListView32.Items.Count-1 do
     begin
       if ListView32.Items[i].Checked then
       begin
         move(Data,SendData.data,k);
         move(sendData,arrSendData[i],length(arrSendData));
       end;
     end;
     FF:=TmemoryStream.Create;
     try
       FF.Clear;
       FF.WriteBuffer(arrSendData,sizeof(arrSendData));
       FF.Seek(0,soFromBeginning);
       FF.ReadBuffer(arrSendData,sizeof(arrSendData));  
       if VCI_Transmit(VCI_CANET_UDP,m_devind,0,@arrSendData,1)=1 then
        begin
        end;
      finally
      ff.free;
     end;
    这样读出的数据为空,请大家帮指点下,错在哪里,本人水平很菜,有所冒犯在所难免
      

  9.   

    var
       SendData:VCI_CAN_OBJ;
       lsv:TlistItem;
       FF:TmemoryStream;
       arrSendData,arrSendData1:array[0..9] of VCI_CAN_OBJ;
    begin
    for i:=0 to ListView32.Items.Count-1 do
      begin
       if ListView32.Items[i].Checked then
       begin
       move(Data,SendData.data,k);//data是什么地方来的 K是什么
       move(sendData,arrSendData[i],length(arrSendData)); 这个地方是什么意思,后面的长度是10 明显不对 而且你不能用I作为数组下标 
       //修改如下 定义一个数组下标ipos  初始值为0
       move(Data,arrSendData[ipos].data,k);
       end;
      end;
      FF:=TmemoryStream.Create;
      try
       FF.Clear;
       FF.WriteBuffer(arrSendData,sizeof(arrSendData));
       FF.Seek(0,soFromBeginning);
       FF.ReadBuffer(arrSendData,sizeof(arrSendData));   
       //ff 的操作不是多余的吗 
      if VCI_Transmit(VCI_CANET_UDP,m_devind,0,@arrSendData,1)=1 then
       begin
       end;
       finally
       ff.free;
      end;
    这样读出的数据为空,请大家帮指点下,错在哪里,本人水平很菜,有所冒犯在所难免
      

  10.   

    //修改如下 定义一个数组下标ipos 初始值为0
       move(Data,arrSendData[ipos].data,k);
     inc(ipos)