delphi 串口与多线程Word格式文档下载.docx
- 文档编号:21834016
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:66
- 大小:50.14KB
delphi 串口与多线程Word格式文档下载.docx
《delphi 串口与多线程Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《delphi 串口与多线程Word格式文档下载.docx(66页珍藏版)》请在冰豆网上搜索。
cmbbxTypeOut:
//发送数据的格式
Label16:
Label51:
tmrSerialIn:
TTimer;
MSCommOut:
TMSComm;
MSCommIn:
dtCode2:
dtCode4:
lbCode3:
lbCode4:
ImgTrace:
TImage;
Label17:
Label18:
Label19:
Label20:
Label21:
Label22:
Label23:
Label24:
Label25:
Label26:
lbShowAd0:
lbShowAd1:
lbShowAd4:
lbShowAd5:
lbShowAd2:
lbShowGps5:
lbShowGps1:
lbShowAd7:
lbShowAd6:
lbShowAd3:
Label37:
lbShowGps6:
lbShowGps4:
Label53:
Label54:
Label55:
lbShowGps0:
btSaveTrace:
btLoadTrace:
btSaveData:
Label1:
lbShowModel:
Label3:
Label4:
Label5:
Label6:
Label14:
Label15:
Label39:
Label40:
lbShowPara0:
lbShowPara1:
lbShowPara2:
lbShowPara3:
lbShowPara4:
lbShowPara5:
lbShowPara6:
lbShowPara7:
Label49:
lbShowGps2:
Label57:
lbShowGps3:
Label59:
cmbbxModel:
btSetModel:
cmbbxParaNo:
Label38:
Label60:
Label61:
dtParaValue:
btADInit:
btSetPara:
Label62:
rdgrpDataCode:
TRadioGroup;
dlgSaveData:
TSaveDialog;
dlgLoadTrace:
TOpenDialog;
dlgSaveTrace:
rchdtTmp:
Label2:
TabSheet1:
chrtAcc:
TChart;
chrtGyro:
srsGyroY:
TFastLineSeries;
srsGyroX:
srsGyroZ:
srsAcc1:
srsAcc2:
chrtHeight:
srsHeight:
Label12:
btCharClear:
tbshtSignal:
procedureFormCreate(Sender:
TObject);
procedurebtRecStartClick(Sender:
procedurebtRecStopClick(Sender:
procedurebtRecSaveClick(Sender:
procedurebtSendOutClick(Sender:
proceduretmrSerialInTimer(Sender:
procedurebtSetModelClick(Sender:
procedurebtSetParaClick(Sender:
procedureFormDestroy(Sender:
procedurebtSaveTraceClick(Sender:
procedurebtLoadTraceClick(Sender:
procedurebtADInitClick(Sender:
procedurebtSaveDataClick(Sender:
procedurebtCharClearClick(Sender:
proceduredtCode1Change(Sender:
proceduredtCode2Change(Sender:
proceduredtCode3Change(Sender:
proceduredtCode4Change(Sender:
private
{Privatedeclarations}
public
{Publicdeclarations}
InitADDataFlag:
Boolean;
end;
/////////////////////////////////////////////////////////////////
{
串口接受线程
}
TSerialInThread=class(TThread)
SerialInput:
Variant;
//保存该线程从串口获取得到的数据矩阵不同类型的值赋
Seriallength:
integer;
//该线程需要处理的数据的个数
SerialStr:
String;
//用于保存处理后数据的字符串变量
protected
procedureExecute;
override;
//需要重载
procedureGetData;
//从串口获取数据的过程
procedureTransToStr;
//转换为适合显示的字符串的过程
procedurePostData;
//显示在用户界面的过程
{
串口发送线程
}
TSerialOutThread=class(TThread)
DataOrCode:
//是否要求输出指令,False表明输出数据
SerialOutput:
//发送数据时的数据矩阵
//发送数据时,数据长度
tmpVar:
//发送指令时的数据矩阵
CheckOk:
//用户确定的数据或是指令是否有错误
//从用户界面获取需要输出的数据或是指令代码
procedurePackData;
//根据协议打包数据
procedurePackCode;
//根据协议打包指令
procedurePostData;
//发送给串口控件,实现数据的发送
var
Form1:
TForm1;
implementation
{$R*.dfm}
const
GpsDataCountMax:
integer=20;
//GPS数据包中数据的个数
ParaDataCountMax:
integer=9;
//参数数据包中数据的个数
ADDataCountMax:
integer=16;
//传感器数据包中数据的个数
{
实现线程互斥的句柄。
hMutex:
THandle=0;
//串口接受数据的线程使用的互斥句柄声明一个全局的互斥量句柄变量
hMutex2:
//串口发送数据的线程使用的互斥句柄
用于指令上下传的全局变量
ReceiveCharFlag:
//是否以字符接受串口,False表示以数据接受
ParaDataFlag:
//正在截取参数数据包的标志
GPSDataFlag:
//正在截取GPS数据包的标志
ADDataFlag:
//正在截取传感器数据包的标志
ParaNewDataFlag:
//截取完参数的标志
GPSNewDataFlag:
//截取完GPS数据包的标志
ADNewDataFlag:
//截取完传感器数据包的标志
ParaDataCount:
Integer;
//截取参数数据包的计数器
ADDataCount:
//截取传感器数据包的计数器
GpsDataCount:
//截取GPS数据包的计数器
DownStr:
//用于保存串口下传的所有数据
GpsStr:
//保存GPS数据包的数据
ADStr:
//保存传感器数据包的数据
ParaDataArray:
array[0..8]ofByte;
//接受参数数据包的数组
GpsDataArray:
array[0..19]ofByte;
//接受GPS数据包的数组
ADDataArray:
array[0..15]ofByte;
//接受传感器数据包的数组
ADDataDblArray:
array[0..7]ofdouble;
//传感器实际的采样值
ADDataArrayMean:
array[0..13]ofByte;
//保存传感器静态均值的数组。
//不考虑系统电压。
ParaStrArray:
array[0..3]ofString;
//显示参数数据的字符串数组
GpsStrArray:
array[0..6]ofString;
//显示GPS数据的字符串数组
ADStrArray:
array[0..7]ofString;
//显示传感器的字符串数组
CodeOutStr:
array[1..4]ofString;
//当前上传的指令代码
CodeInStr:
//下传返回的指令代码
用于绘图的全局变量
gpsMeta:
TMetaFile;
//用于保存轨迹图像的对象
posXArray,posYArray:
arrayofdouble;
//保存当前飞行轨迹点的数组
posXArrayLoad,posYArrayLoad:
//保存载入的轨迹点的数组
posLength:
Integer;
//当前飞行轨迹点的总数
posLengthLoad:
函数hex()是将0~f字符转换为0~15的整数。
functionhex(c:
String):
Integer;
var
x:
integer;
begin
if(c='
0'
)or(c='
'
)then
=0
elseifc='
1'
then
=1
elseifc='
2'
=2
3'
=3
4'
=4
5'
=5
6'
=6
7'
=7
8'
=8
9'
=9
elseif((c='
a'
A'
))then
=10
elseif(c='
b'
B'
=11
c'
C'
=12
d'
D'
=13
e'
E'
=14
f'
F'
=15
else
=-1;
Result:
=x;
functionHexToInt(S:
tmpInt1,tmpInt2:
ifLength(S)=1then
=hex(S[1]);
end
elseifLength(S)=2then
tmpInt1:
tmpInt2:
=hex(S[2]);
if(tmpInt1=-1)or(tmpInt2=-1)then
=-1
=tmpInt1*16+tmpInt2;
functionGetMaxValue(x,y,x1,y1:
ArrayofDouble;
len,len1:
Integer):
double;
i:
begin
result:
=0;
fori:
=0tolen-1do
ifabs(x[i])>
resultthen
=abs(x[i]);
ifabs(y[i])>
resultthen
=abs(y[i]);
=0tolen1-1do
ifabs(x1[i])>
=abs(x1[i]);
ifabs(y1[i])>
=abs(y1[i]);
end;
/////////////////////////////////////////////////////////////////
{绘制飞行轨迹的函数
红色轨迹是载入的,
蓝色的轨迹是当前轨迹点
1.posXArray,posYArray是当前轨迹点的坐标,
posLength是当前轨迹点的个数
2.posXArrayLoad,posYArrayLoad是载入的轨迹点的坐标,
posLengthLoad是载入的轨迹点的个数
procedureDrawAxis;
i,x,y,wid,h:
pstep,ratio,maxV:
can:
TMetaFileCanvas;
can:
=TMetaFileCanvas.Create(gpsMeta,0);
//建立一个画布对象
gpsMeta.Width:
=Form1.ImgTrace.Width;
//确定画布对应图像的大小
gpsMeta.Height:
=Form1.ImgTrace.Height;
wid:
=gpsMeta.Width;
h:
=gpsMeta.Height;
确定直角坐标的最大值,取10,100,200,500,1000,2000,5000,10000,50000,100000的最小值
缺省状态取100
maxV:
=GetMaxValue(posXArray,posYArray,posXArrayLoad,posYArrayLoad,posLength,posLengthLoad);
ifmaxV=0then
=100;
ifmaxV<
=10then
=10;
elseifmaxV<
=100then
=200then
=200
elseifmaxV<
=500then
=500
=1000then
=1000;
=2000then
=2000
=5000then
=5000
=10000then
=10000;
=50000then
=50000
=100000then
=100000;
=1000000;
can.Pen.Color:
=clBlack;
can.Pen.Style:
=psSolid;
can.MoveTo(0,hdiv2);
can.LineTo(wid,hdiv2);
can.MoveTo(widdiv2,0);
can.LineTo(widdiv2,h);
can.Font.Height:
can.Font.Name:
='
Arial'
;
绘制坐标的最大刻度值
can.TextOut(0,hdiv2+1,IntToStr(-1*round(maxV)));
can.TextOut(wid-can.TextWidth(IntToStr(round(maxV))),
hdiv2+1,IntToStr(round(maxV)));
can.TextOut(widdiv2+3,
h-can.TextHeight(IntToStr(-1*round(maxV))),IntToStr(-1*round(maxV)));
can.TextOut(widdiv2+1,0,IntToStr(round(maxV)));
绘制坐标的刻度,每个座标轴上有21条刻线
pstep:
=wid/20;
=0to21do
can.MoveTo(round(pstep*i),hdiv2-2);
can.LineTo(round(pstep*i),hdiv2);
can.MoveTo(widdiv2,round(pstep*i));
can.LineTo(widdiv2+2,round(pstep*i));
绘制载入的轨迹,颜色为红色
ifposLengthLoad>
0then
=clRed;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- delphi 串口与多线程 串口 多线程