📄 unit111.pas
字号:
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 + -