串口发送的数据格式是两个包相见发送的没有顺序,其中包1是f5 0a 03 fa _ _ _ fa _ _ _ fa _ _ _.........fa _ _ _c0 00 和包2是f5 0b 02 fb _ _ fb_ _ fb _ _ .........fb _ _ c0 00
(其中f5 oa o3和f5 ob o2 包头,03和02是帧后面的数据长度)c0 00是包尾,fa和fb是每个帧头,如何提取出来每个帧后面的划线的三或者两个数据并显示在iplot框中),以及包尾前面的两个数据显示在memo框中最近在做课程设计,研究一个月了,这些东西还是不会
以下是我的代码实现哪儿错了?
for i:=b to a-1 do
begin
if(indata[i]=$f5)and(indata[i+1]=$0a)then
begin
if(indata[i+2]=$03)then
begin
for d:=i to a-1 do
begin
if (indata[d+3]=$fa)then
begin
y1:=indata[i+4]*256+indata[d+5]*256+indata[d+6];
y11:=y1;
y111:=FormatFloat('00.000',y11);
if TryStrToFloat(y111,c1) then
begin
iplot1.channel[0].AddXY(j/h,c1);
end;
inc(j);
end
else
if(indata[d+3]=$c0)and(indata[d+4]=$00)then
begin
y2:=indata[d+1];
y3:=indata[d+2]; y22:=FormatFloat('00.000',y2);
y33:=FormatFloat('00.000',y3); memo2.Lines.Clear;
memo2.Lines.Add(y22);
memo3.Lines.Clear;
memo3.Lines.Add(y33);
end;
end;
end;
break;
end
else
if(indata[i]=$f5)and(indata[i+1]=$0b)then
begin
if(indata[i+2]=$02)then
begin
for c:=i to a-1 do
begin
if (indata[c+3]=$fb)then
begin
y4:=indata[c+4]*256+indata[c+5];
y44:=FormatFloat('00.000',y4);
if TryStrToFloat(y44,c2) then
begin
iplot1.channel[1].AddXY(j/h,c2);
end;
inc(j);
end
else
if (indata[c+3]=$c0)and(indata[c+4]=$00)then
begin
y5:=indata[c+1];
y6:=indata[c+2]; y55:=FormatFloat('00.000',y5);
y66:=FormatFloat('00.000',y6); memo4.Lines.Add(y55);
memo5.Lines.Add(y66);
end;
end;
end;
end;
break;
end;
(其中f5 oa o3和f5 ob o2 包头,03和02是帧后面的数据长度)c0 00是包尾,fa和fb是每个帧头,如何提取出来每个帧后面的划线的三或者两个数据并显示在iplot框中),以及包尾前面的两个数据显示在memo框中最近在做课程设计,研究一个月了,这些东西还是不会
以下是我的代码实现哪儿错了?
for i:=b to a-1 do
begin
if(indata[i]=$f5)and(indata[i+1]=$0a)then
begin
if(indata[i+2]=$03)then
begin
for d:=i to a-1 do
begin
if (indata[d+3]=$fa)then
begin
y1:=indata[i+4]*256+indata[d+5]*256+indata[d+6];
y11:=y1;
y111:=FormatFloat('00.000',y11);
if TryStrToFloat(y111,c1) then
begin
iplot1.channel[0].AddXY(j/h,c1);
end;
inc(j);
end
else
if(indata[d+3]=$c0)and(indata[d+4]=$00)then
begin
y2:=indata[d+1];
y3:=indata[d+2]; y22:=FormatFloat('00.000',y2);
y33:=FormatFloat('00.000',y3); memo2.Lines.Clear;
memo2.Lines.Add(y22);
memo3.Lines.Clear;
memo3.Lines.Add(y33);
end;
end;
end;
break;
end
else
if(indata[i]=$f5)and(indata[i+1]=$0b)then
begin
if(indata[i+2]=$02)then
begin
for c:=i to a-1 do
begin
if (indata[c+3]=$fb)then
begin
y4:=indata[c+4]*256+indata[c+5];
y44:=FormatFloat('00.000',y4);
if TryStrToFloat(y44,c2) then
begin
iplot1.channel[1].AddXY(j/h,c2);
end;
inc(j);
end
else
if (indata[c+3]=$c0)and(indata[c+4]=$00)then
begin
y5:=indata[c+1];
y6:=indata[c+2]; y55:=FormatFloat('00.000',y5);
y66:=FormatFloat('00.000',y6); memo4.Lines.Add(y55);
memo5.Lines.Add(y66);
end;
end;
end;
end;
break;
end;
TakeTime: string[28]; // 拍照时间
TakeAdr: string[50]; // 拍照地点
TakePixel: string[10]; // 拍照像素
ImageName: string[50]; // 图片名
end;
PInfomationData = ^TInfomationData;//TCP数据包
TTCPData = packed record
tdType: Word; // 包类型
tdLength: Cardinal; // 数据项长度( tdInfo + tdPicture )
tdInfo: TInfomationData;
tdPicture: array of byte; // 存放图片数据
end;
PTCPData = ^ TTCPData;等等。确定数据包的结构,你就可以正确读取了。
第二步:取帧数据
procedure TForm1.Button1Click(Sender: TObject);
var
Str_RecFrame:string;
sl_FrameList:TStringList;
begin
sl_FrameList:=TStringList.Create;
try
Str_RecFrame:=StringReplace(Str_RecFrame,' ','',[rfReplaceAll]);
//分帧
while str_RecFrame<>'' do
begin
Delete(Str_RecFrame,1,Pos('f50a')-1);
if Copy(Str_RecFrame,1,4)='f50a' then
begin
i_Index:=StrToInt('$'+Copy(Str_RecFrame,5,2)) * 2 + 6 + 1; //帧头长度+固定长度+1 ,这里可能有误
if Copy(Str_RecFrame,i_Index,4)='c000' then
begin
sl_FrameList.Add(Copy(Str_RecFrame,1,i_Index+3));
end;
end else
begin
Delete(Str_RecFrame,1,Length(Str_RecFrame));
end
end; //Add your code 取帧数据
finally
sl_Framelist.Free;
end;
end;注:代码未调试,按照我的思路结构就是这样