问题:
定义一个结构体
一行数据写入一个结构体,俩行数据写入俩个同一类型结构体,八行数据写入八个结构体(都是同一结构体),然后如何把八个结构体数据累加在一起再发送(不是一条一条发送),请问如何做才能把数据累加在一块?累加时后面的数据不能覆盖前面的数据。结构体:
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
定义一个结构体
一行数据写入一个结构体,俩行数据写入俩个同一类型结构体,八行数据写入八个结构体(都是同一结构体),然后如何把八个结构体数据累加在一起再发送(不是一条一条发送),请问如何做才能把数据累加在一块?累加时后面的数据不能覆盖前面的数据。结构体:
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
将记录放在数组中
帧类型 帧格式 帧ID 数据(hex)
每条数据的内容是:
帧类型 帧格式 帧ID 数据(hex)
标准帧 数据帧 00000 11 12 12 13 //第一条
标准帧 数据帧 00000 22 23 24 25 //第二条需要把俩条数据累加在一块
{标准帧 数据帧 00000 11 12 12 13 标准帧 数据帧 00000 22 23 24 25 }然后再发送 顶顶啊
举例发送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);
如果包比较大的时候 哪怕你把几个包一起发出去,tcp也可能给你切成几片
1、定义packed record
2、将你选中的记录依次放到数组中
3、发送的时候 buf指向数组首指针
调用的是别人的dll函数
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;
这样读出的数据为空,请大家帮指点下,错在哪里,本人水平很菜,有所冒犯在所难免
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;
这样读出的数据为空,请大家帮指点下,错在哪里,本人水平很菜,有所冒犯在所难免
move(Data,arrSendData[ipos].data,k);
inc(ipos)