串口发送的数据格式是两个包相见发送的没有顺序,其中包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;

解决方案 »

  1.   

    @lyhoo163  数据包的数据结构一般指的是什么?
      

  2.   

    数据包的数据结构,发送方和接受方的约定,例如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;等等。确定数据包的结构,你就可以正确读取了。
      

  3.   

    第一步:根据帧结构分帧,取的合法的帧    
    第二步:取帧数据
    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;注:代码未调试,按照我的思路结构就是这样