串口發送的資料格式是兩個包相見發送的沒有順序,其中包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;
uj5u.com熱心網友回復:
首先要搞清楚資料包的資料結構。才能有效讀取。uj5u.com熱心網友回復:
資料包的資料結構一般指的是什么?uj5u.com熱心網友回復:
@lyhoo163 資料包的資料結構一般指的是什么?uj5u.com熱心網友回復:
資料包的資料結構,發送方和接受方的約定,例如TInfomationData = packed record
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;
等等。確定資料包的結構,你就可以正確讀取了。
uj5u.com熱心網友回復:
資料包的結構,你可以向軟體的編者索取。uj5u.com熱心網友回復:
你也可以通過分析,自已畫出它的結構。uj5u.com熱心網友回復:
第一步:根據幀結構分幀,取的合法的幀第二步:取幀資料
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;
注:代碼未除錯,按照我的思路結構就是這樣
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/56562.html
標籤:語言基礎/算法/系統設計
