⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit111.pas

📁 模型飞机测控平台是在模型飞机使用的设备基础上增加测量和控制设备.
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit Unit111;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, OleCtrls, CWUIControlsLib_TLB,
  Buttons, TeEngine, Series, TeeProcs, Chart, MSCommLib_TLB,inifiles;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Label1: TLabel;
    TabSheet2: TTabSheet;
    SldHeight: TCWSlide;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    ImgTrace: TImage;
    GroupBox3: TGroupBox;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    GroupBox4: TGroupBox;
    lbGpsX: TLabel;
    lbGpsY: TLabel;
    lbGpsNav: TLabel;
    lbGpsSpeed: TLabel;
    GroupBox5: TGroupBox;
    GroupBox6: TGroupBox;
    GroupBox7: TGroupBox;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    lbGyroX: TLabel;
    lbGyroY: TLabel;
    lbGyroZ: TLabel;
    lbAccX: TLabel;
    lbAccY: TLabel;
    lbAccZ: TLabel;
    lbRawHeight: TLabel;
    lbRevs1: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    Label24: TLabel;
    Label25: TLabel;
    Label27: TLabel;
    btSetSensorZero: TButton;
    GroupBox9: TGroupBox;
    GroupBox10: TGroupBox;
    GroupBox11: TGroupBox;
    Label32: TLabel;
    Label33: TLabel;
    lbControlAil: TLabel;
    lbControlEle: TLabel;
    Label36: TLabel;
    Label37: TLabel;
    lbRawAil: TLabel;
    lbRawEle: TLabel;
    Label41: TLabel;
    cmbbxSerialIn: TComboBox;
    cmbbxBaudIn: TComboBox;
    rchdtSerialIn: TRichEdit;
    btnClearSerial: TButton;
    btnOpenSerial: TButton;
    rchdtTmp: TRichEdit;
    btnStoreSerial: TButton;
    btnAllStart: TButton;
    btnAllStop: TButton;
    btnDataStore: TButton;
    ChartControl: TChart;
    srsControlAil: TFastLineSeries;
    srsControlEle: TFastLineSeries;
    srsRawAil: TFastLineSeries;
    srsRawEle: TFastLineSeries;
    ChartHeightor: TChart;
    srsRawHeight: TFastLineSeries;
    ChartGyro: TChart;
    srsGyroY: TFastLineSeries;
    srsGyroX: TFastLineSeries;
    srsGyroZ: TFastLineSeries;
    btnHeightorSave: TBitBtn;
    btnHeightorClear: TBitBtn;
    TabSheet3: TTabSheet;
    GroupBox12: TGroupBox;
    GroupBox13: TGroupBox;
    Label56: TLabel;
    cmbbxModel: TComboBox;
    btnSetModel: TButton;
    lbCurModel: TLabel;
    MSComm1: TMSComm;
    tmrSerial: TTimer;
    btnCloseSerial: TButton;
    dlgDataSave: TSaveDialog;
    Label14: TLabel;
    lbAilSpeed: TLabel;
    GroupBox14: TGroupBox;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    lbHegihtD: TLabel;
    lbRollD: TLabel;
    lbDefD: TLabel;
    edtSetDef: TEdit;
    edtSetRoll: TEdit;
    edtSetHeight: TEdit;
    btnSetHeight: TButton;
    btnSetRoll: TButton;
    btnSetDef: TButton;
    lbDataCount: TLabel;
    GroupBox16: TGroupBox;
    Label43: TLabel;
    lbModel1: TLabel;
    edtSerialOut1: TEdit;
    lbModel2: TLabel;
    edtSerialOut2: TEdit;
    lbModel3: TLabel;
    edtSerialOut3: TEdit;
    lbModel4: TLabel;
    edtSerialOut4: TEdit;
    btnSendCode: TButton;
    rdbtnData: TRadioButton;
    Label17: TLabel;
    rdbtnCode: TRadioButton;
    rchdtSerialOut: TRichEdit;
    btnGPSLoad: TButton;
    rchdtSerialOutEvent: TRichEdit;
    tmrAutoSaveData: TTimer;
    GroupBox17: TGroupBox;
    lbSaveName: TLabel;
    dlgPath: TOpenDialog;
    Button2: TButton;
    GroupBox18: TGroupBox;
    Label46: TLabel;
    Label47: TLabel;
    Label48: TLabel;
    Label49: TLabel;
    lbAgue3: TLabel;
    lbAgue2: TLabel;
    lbAgue1: TLabel;
    lbAgue0: TLabel;
    GroupBox19: TGroupBox;
    Label50: TLabel;
    Label51: TLabel;
    Label52: TLabel;
    Label53: TLabel;
    lbAgue7: TLabel;
    lbAgue6: TLabel;
    lbAgue5: TLabel;
    lbAgue4: TLabel;
    Label54: TLabel;
    Label55: TLabel;
    cmbbxAgueNo: TComboBox;
    edtAgueValue: TEdit;
    btnSetPar: TButton;
    GroupBox8: TGroupBox;
    lbDspControl: TLabel;
    Label29: TLabel;
    Label30: TLabel;
    lbModel: TLabel;
    Label26: TLabel;
    lbSystemVolt: TLabel;
    btnAutoSw: TBitBtn;
    Label15: TLabel;
    sldSpeed: TCWSlide;
    sldNavAngel: TCWKnob;
    Label18: TLabel;
    lbAgue8: TLabel;
    procedure btnSendCodeClick(Sender: TObject);
    procedure btnHeightorSaveClick(Sender: TObject);
    procedure btnHeightorClearClick(Sender: TObject);
    procedure btnOpenSerialClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnCloseSerialClick(Sender: TObject);
    procedure btnStoreSerialClick(Sender: TObject);
    procedure btnClearSerialClick(Sender: TObject);
    procedure edtSerialOut1Change(Sender: TObject);
    procedure edtSerialOut2Change(Sender: TObject);
    procedure edtSerialOut3Change(Sender: TObject);
    procedure edtSerialOut4Change(Sender: TObject);
    procedure tmrSerialTimer(Sender: TObject);
    procedure btnAllStartClick(Sender: TObject);
    procedure btnAllStopClick(Sender: TObject);
    procedure btnDataStoreClick(Sender: TObject);
    procedure tmrAutoSaveDataTimer(Sender: TObject);
    procedure lbSaveNameClick(Sender: TObject);
    procedure btnGPSLoadClick(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure btSetSensorZeroClick(Sender: TObject);
    procedure btnSetModelClick(Sender: TObject);
    procedure btnSetParClick(Sender: TObject);
    procedure btnSetHeightClick(Sender: TObject);
    procedure btnSetDefClick(Sender: TObject);
    procedure btnSetRollClick(Sender: TObject);
    procedure btnAutoSwClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure DrawAxis;
  end;

  TSerialInThread =class(TThread)
  private
        SerialInput:Variant;
        Seriallength : integer;

  protected
        procedure Execute; override;
        procedure GetData;
        procedure PostData ;
        procedure SaveFormatData;
  end;

  TSerialOutThread =class(TThread)
  private
        SerialOutput:String;
        CodeOut:Array[1..4] of String;
        tmpVar:Variant;
        Seriallength : integer;
        CheckOk,DataOrCode:Boolean;

  protected
        procedure Execute; override;
        procedure GetData;
        procedure PostData;
        procedure PackData;
        procedure PackCode;
  end;

var
        Form1: TForm1;
        hMutex:THandle =0;
        hMutex2:THandle =0;

        AutoSaveCount :Integer=0;

        AgueNewDataFlag,GPSNewDataFlag,MemsNewDataFlag:Boolean;
        AgueDataFlag,GPSDataFlag,MemsDataFlag:Boolean;
        AgueDataFlagFirst,MemsDataFlagFirst,GpsDataFlagFirst:boolean;
        NewOneFlag:boolean;

        StartControlCount,MemsDataCount,GpsDataCount,AgueDataCount:Integer;
        MemsInitFlag:Boolean;
        MemsDataArray:array[0..27] of Byte;
        MemsDataArrayZero:array[0..19] of Byte;

        gpsMeta: TMetaFile;
        posXArray,posXArrayLoad: array of double;
        posYArray,posYArrayLoad: array of double;
        posZArray,ImageHeightArray: array of double;
        posLength,posLengthLoad,zLength,ImageHeightLength: Integer;

        MemsStrArray:array[0..9] of String;       //接收传感器数据包的数组
        GyroDataArray:array[0..2] of double;      //接收传感器数据包的数组
        GpsDataArray:array[0..11] of Byte;
        GpsStrArray:array[0..7] of String;
        ModelStrArray:array[0..3] of String;
        AgueDataArray:array[0..18] of Byte;
        DspContrStr:array[0..1] of String;
        DspContrValue:array[0..1] of SmallInt;
        ContrStr:array[0..1] of String;
        ContrValue:array[0..1] of SmallInt;
        DataOut:array[0..3] of String;

        FormatDownStr,DownStr,GpsStr1,MemsStr,AgueStr:String;
        TempGpsStr1,TempMemsStr,TempAgueStr:String;
        SerialStr:String;
        ControlFlag: boolean;
        curStr:String;
        kMemHeight,MemHeight:double;
        GpsNavAngel,GpsSpeed:Integer;


const
        GpsDataCountMax : integer = 8;
        AgueDataCountMax: integer =19;
        MemsDataCountMax: integer =28;

implementation

{$R *.dfm}
//*****************************************************
//          自定义函数::GetMaxValue()  hex()    HexToInt()
//*****************************************************
      function GetMaxValue(x,y,x1,y1: Array of Double;len,len1: Integer): double;
      var
          i: Integer;
      begin
        result := 0;
        for i:=0 to len-1 do
        begin
          if abs(x[i])>result then
            result := abs(x[i]);
          if abs(y[i]) > result then
            result := abs(y[i]);
        end;
        for i:=0 to len1-1 do
        begin
          if abs(x1[i])>result then
            result := abs(x1[i]);
          if abs(y1[i]) > result then
            result := abs(y1[i]);
        end;
      end;

    function hex(c:char):Integer ;
    var
        x:integer;
    begin
       if c=' ' then
          x:=0
       else if (Ord(c)>=ord('0')) and (Ord(c)<=ord('9')) then
          x:=Ord(c)-Ord('0')
       else if (Ord(c)>=ord('a')) and (Ord(c)<=ord('f')) then
          x:=Ord(c)-Ord('a')+10
       else if (Ord(c)>=ord('A')) and (Ord(c)<=ord('F')) then
          x:=Ord(c)-Ord('A')+10
       else
          //输入错误
        x:=-1;
        Result:=x;
    end;


       function HexToInt(S:String): Integer;
       var
          tmpInt1,tmpInt2:Integer ;
       begin
//          if Length(S)<>2 then
//            Result:=-1
//          else
          if Length(S)=1 then
              begin
              Result:=hex(S[1]);
              end
          else if Length(S)=2 then
              begin
              tmpInt1:=hex(S[1]);
              tmpInt2:=hex(S[2]);
              if (tmpInt1=-1) or (tmpInt2=-1) then
               Result:=-1
              else
               Result:= tmpInt1*16+tmpInt2;
              end;

end;
//*****************************************************
//          串口输出处理进程
//*****************************************************
procedure TSerialOutThread.GetData ;
begin
      DataOrCode:=Form1.rdbtnData.Checked;
      Seriallength:=Length(Form1.RchdtSerialOut.Text);
      SerialOutput:=Form1.RchdtSerialOut.Text;
      CodeOut[1]:=Form1.edtSerialOut1.Text ;
      CodeOut[2]:=Form1.edtSerialOut2.Text;
      CodeOut[3]:=Form1.edtSerialOut3.Text;
      CodeOut[4]:=Form1.edtSerialOut4.Text;
end;
procedure TSerialOutThread.PostData ;
begin
     if CheckOk=True then
     begin
//       if Form1.rdbtnAscii.Checked=True then
//              Form1.MSComm2.Output:=SerialOutput
//              Form1.MSComm1.Output:=SerialOutput;
//       else
              Form1.MSComm1.Output:=tmpVar;
//              Form1.MSComm1.Output:=tmpVar
     end
     else
       ShowMessage('数据格式有问题,停止发送');
end;
procedure TSerialOutThread.PackData;
var
     tmpStr1,tmpStr2:String;
     MaxCount,Count,tmpInt,i:Integer;
begin
     SetLength(tmpStr2,1);
     Count:=1;
     MaxCount:=1;
     CheckOk:=True;
     {
    使用互斥实现线程的同步,主要是为了防止数据流顺序的发生错误
    }

     if WaitForSingleObject(hMutex2,InFinite) =WAIT_OBJECT_0 then
     begin
        if Seriallength >0 then
        begin
           i:=1;
           tmpVar:=VarArrayCreate([1,1],varByte);
           while(i<Seriallength) do
           begin
              tmpStr1:=Copy(SerialOutput,i,2);
              tmpStr1:=LowerCase(tmpStr1);
              tmpInt:=HexToInt(tmpStr1);
              if tmpInt<>-1 then
              begin
                 if Count=(MaxCount+1) then
                 begin
                   MaxCount:=MaxCount+1;
                   VarArrayRedim(tmpVar,MaxCount);
                 end;
                 tmpVar[Count]:=tmpInt;
                 Count:=Count+1;
              end else
              begin
                  CheckOk:=False;        //数据格式有问题,无法解读
                  break;                 //停止while循环
              end;
              i:=i+3;                    //跳过3个字符
           end;
           PostData;
        end;
     end;
end;
procedure TSerialOutThread.PackCode;
var
    tmpInt,i:Integer;
begin //15*0x55 0x24 4*code 0d 0a;=22
    tmpVar:=VarArrayCreate([1,22],varByte);
    CheckOk:=True;
    for i:=1 to 15  do
    begin
        tmpVar[i]:=85;//0x55
    end;
    tmpVar[10]:=12;
    tmpVar[16]:=36;//0x24=32+4=36
    for i:=1 to 4 do
    begin
        tmpInt:=HexToInt(CodeOut[i]);
        if tmpInt<>-1 then
          tmpVar[16+i]:= tmpInt
        else
        begin
           CheckOk:=False;
           Break;
        end;
    end;
    tmpVar[21]:=13;//0x0d
    tmpVar[22]:=10;//0x0a
    PostData;
end;

procedure TSerialOutThread.Execute;

begin
     FreeOnTerminate:=True;
     GetData;
     if DataOrCode=True then
        PackData
     else
        PackCode;
     ReleaseMutex(hMutex2);
end;
//*****************************************************
//          串口输入处理进程
//*****************************************************
procedure TSerialInThread.GetData ;
begin
              Seriallength:=Form1.MSComm1.InBufferCount;
              SerialInput:=Form1.MSComm1.Input;
end;

procedure TSerialInThread.SaveFormatData ;
var
    i:Integer;
    tmpSInt,tmpSInt1:SmallInt;
    XPoint,YPoint,tmpDbl:double;
begin
    if MemsNewDataFlag =True then
    begin
       GyroDataArray[0]:=0.1822*((15 and MemsDataArray[0])*256+MemsDataArray[1]-(15 and MemsDataArrayZero[0])*256-MemsDataArrayZero[1]);
       MemsStrArray[0]:=FloatToStrF(GyroDataArray[0],ffFixed,4,2);
       GyroDataArray[1]:=0.1822*((15 and MemsDataArray[2])*256+MemsDataArray[3]-(15 and MemsDataArrayZero[2])*256-MemsDataArrayZero[3]);
       MemsStrArray[1]:=FloatToStrF(GyroDataArray[1],ffFixed,4,2);
       GyroDataArray[2]:=0.1822*((15 and MemsDataArray[4])*256+MemsDataArray[5]-(15 and MemsDataArrayZero[4])*256-MemsDataArrayZero[5]);
       MemsStrArray[2]:=FloatToStrF(GyroDataArray[2],ffFixed,4,2);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -