ImageVerifierCode 换一换
格式:DOCX , 页数:66 ,大小:50.14KB ,
资源ID:8697825      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8697825.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(delphi 串口与多线程.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

delphi 串口与多线程.docx

1、delphi 串口与多线程unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, OleCtrls, MSCommLib_TLB;type TForm1 = class(TForm) tbshtSignalChart: TPageControl; tbshtDebug: TTabSheet; /串口调试 r

2、chdtSerialIn: TRichEdit; /串口发送的数据 cmbbxSerialIn: TComboBox; /串口号 Label7: TLabel; btRecStart: TButton; /开始接受 btRecStop: TButton; /停止 cmbbxBaudIn: TComboBox; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; btRecSave: TButton; /保存 cmbbxTypeIn: TComboBox; cmbbxSerialOut: TComboBox; /串口

3、端号 Label13: TLabel; cmbbxBaudOut: TComboBox; /波特率 rchdtSerialOut: TRichEdit; /输入发送 btSendOut: TButton; dtCode1: TEdit; lbCode1: TLabel; lbCode2: TLabel; dtCode3: TEdit; cmbbxTypeOut: TComboBox; /发送数据的格式 Label16: TLabel; Label51: TLabel; tmrSerialIn: TTimer; MSCommOut: TMSComm; MSCommIn: TMSComm; dtC

4、ode2: TEdit; dtCode4: TEdit; lbCode3: TLabel; lbCode4: TLabel; ImgTrace: TImage; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label20: TLabel; Label21: TLabel; Label22: TLabel; Label23: TLabel; Label24: TLabel; Label25: TLabel; Label26: TLabel; lbShowAd0: TLabel; lbShowAd1: TLabel; lbShowAd4:

5、TLabel; lbShowAd5: TLabel; lbShowAd2: TLabel; lbShowGps5: TLabel; lbShowGps1: TLabel; lbShowAd7: TLabel; lbShowAd6: TLabel; lbShowAd3: TLabel; Label37: TLabel; lbShowGps6: TLabel; lbShowGps4: TLabel; Label53: TLabel; Label54: TLabel; Label55: TLabel; lbShowGps0: TLabel; btSaveTrace: TButton; btLoadT

6、race: TButton; btSaveData: TButton; Label1: TLabel; lbShowModel: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label14: TLabel; Label15: TLabel; Label39: TLabel; Label40: TLabel; lbShowPara0: TLabel; lbShowPara1: TLabel; lbShowPara2: TLabel; lbShowPara3: TLabel; lbShowPara4

7、: TLabel; lbShowPara5: TLabel; lbShowPara6: TLabel; lbShowPara7: TLabel; Label49: TLabel; lbShowGps2: TLabel; Label57: TLabel; lbShowGps3: TLabel; Label59: TLabel; cmbbxModel: TComboBox; btSetModel: TButton; cmbbxParaNo: TComboBox; Label38: TLabel; Label60: TLabel; Label61: TLabel; dtParaValue: TEdi

8、t; btADInit: TButton; btSetPara: TButton; Label62: TLabel; rdgrpDataCode: TRadioGroup; dlgSaveData: TSaveDialog; dlgLoadTrace: TOpenDialog; dlgSaveTrace: TSaveDialog; rchdtTmp: TRichEdit; Label2: TLabel; TabSheet1: TTabSheet; chrtAcc: TChart; chrtGyro: TChart; srsGyroY: TFastLineSeries; srsGyroX: TF

9、astLineSeries; srsGyroZ: TFastLineSeries; srsAcc1: TFastLineSeries; srsAcc2: TFastLineSeries; chrtHeight: TChart; srsHeight: TFastLineSeries; Label12: TLabel; btCharClear: TButton; tbshtSignal: TTabSheet; procedure FormCreate(Sender: TObject); procedure btRecStartClick(Sender: TObject); procedure bt

10、RecStopClick(Sender: TObject); procedure btRecSaveClick(Sender: TObject); procedure btSendOutClick(Sender: TObject); procedure tmrSerialInTimer(Sender: TObject); procedure btSetModelClick(Sender: TObject); procedure btSetParaClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure b

11、tSaveTraceClick(Sender: TObject); procedure btLoadTraceClick(Sender: TObject); procedure btADInitClick(Sender: TObject); procedure btSaveDataClick(Sender: TObject); procedure btCharClearClick(Sender: TObject); procedure dtCode1Change(Sender: TObject); procedure dtCode2Change(Sender: TObject); proced

12、ure dtCode3Change(Sender: TObject); procedure dtCode4Change(Sender: TObject); private Private declarations public Public declarations InitADDataFlag:Boolean; end; /串口接受线程 TSerialInThread =class(TThread) private SerialInput:Variant; /保存该线程从串口获取得到的数据矩阵不同类型的值赋 Seriallength : integer; /该线程需要处理的数据的个数 Ser

13、ialStr:String; /用于保存处理后数据的字符串变量 protected procedure Execute; override; /需要重载 procedure GetData; /从串口获取数据的过程 procedure TransToStr; /转换为适合显示的字符串的过程 procedure PostData ; /显示在用户界面的过程 end; / 串口发送线程 TSerialOutThread =class(TThread) private DataOrCode:Boolean; /是否要求输出指令,False表明输出数据 SerialOutput:String; /发送

14、数据时的数据矩阵 Seriallength : integer; /发送数据时,数据长度 tmpVar:Variant; /发送指令时的数据矩阵 CheckOk:Boolean; /用户确定的数据或是指令是否有错误 protected procedure Execute; override; /需要重载 procedure GetData; /从用户界面获取需要输出的数据或是指令代码 procedure PackData; /根据协议打包数据 procedure PackCode; /根据协议打包指令 procedure PostData; /发送给串口控件,实现数据的发送 end;var F

15、orm1: TForm1;implementation$R *.dfmconst GpsDataCountMax : integer = 20; /GPS数据包中数据的个数 ParaDataCountMax: integer = 9; /参数数据包中数据的个数 ADDataCountMax:integer =16; /传感器数据包中数据的个数var 实现线程互斥的句柄。 hMutex:THandle =0; /串口接受数据的线程使用的互斥句柄 声明一个全局的互斥量句柄变量 hMutex2:THandle =0; /串口发送数据的线程使用的互斥句柄 用于指令上下传的全局变量 ReceiveCha

16、rFlag:Boolean; /是否以字符接受串口,False表示以数据接受 ParaDataFlag:Boolean; /正在截取参数数据包的标志 GPSDataFlag:Boolean; /正在截取GPS数据包的标志 ADDataFlag:Boolean; /正在截取传感器数据包的标志 ParaNewDataFlag:Boolean; /截取完参数的标志 GPSNewDataFlag:Boolean; /截取完GPS数据包的标志 ADNewDataFlag:Boolean; /截取完传感器数据包的标志 ParaDataCount:Integer; /截取参数数据包的计数器 ADDataCo

17、unt:Integer; /截取传感器数据包的计数器 GpsDataCount:Integer; /截取GPS数据包的计数器 DownStr:String; /用于保存串口下传的所有数据 GpsStr:String; /保存GPS数据包的数据 ADStr:String; /保存传感器数据包的数据 ParaDataArray:array0.8 of Byte; /接受参数数据包的数组 GpsDataArray:array0.19 of Byte; /接受GPS数据包的数组 ADDataArray:array0.15 of Byte; /接受传感器数据包的数组 ADDataDblArray:arr

18、ay0.7 of double; /传感器实际的采样值 ADDataArrayMean:array0.13 of Byte; /保存传感器静态均值的数组。 /不考虑系统电压。 ParaStrArray:array0.3 of String; /显示参数数据的字符串数组 GpsStrArray:array0.6 of String; /显示GPS数据的字符串数组 ADStrArray:array0.7 of String; /显示传感器的字符串数组 用于指令上下传的全局变量 CodeOutStr:array1.4 of String; /当前上传的指令代码 CodeInStr:array0.3

19、of String; /下传返回的指令代码 用于绘图的全局变量 gpsMeta: TMetaFile; /用于保存轨迹图像的对象 posXArray,posYArray: array of double; /保存当前飞行轨迹点的数组 posXArrayLoad,posYArrayLoad: array of double; /保存载入的轨迹点的数组 posLength: Integer; /当前飞行轨迹点的总数 posLengthLoad: Integer; /当前飞行轨迹点的总数 函数hex()是将0f字符转换为015的整数。 function hex(c:String):Integer ;

20、 var x:integer; begin if (c=0) or (c= ) then x:=0 else if c=1 then x:=1 else if c = 2 then x:=2 else if c=3 then x:=3 else if c=4 then x:=4 else if c=5 then x:=5 else if c=6 then x:=6 else if c=7 then x:=7 else if c=8 then x:=8 else if c=9 then x:=9 else if (c=a) or (c=A) then x:=10 else if (c=b) or

21、 (c=B) then x:=11 else if (c=c) or (c=C) then x:=12 else if (c=d) or (c=D) then x:=13 else if (c=e) or (c=E) then x:=14 else if (c=f) or (c=F) then x:=15 else x:=-1; Result:=x; end; function HexToInt(S:String): Integer; var tmpInt1,tmpInt2:Integer ; begin if Length(S)=1 then begin Result:=hex(S1); e

22、nd else if Length(S)=2 then begin tmpInt1:=hex(S1); tmpInt2:=hex(S2); if (tmpInt1=-1) or (tmpInt2=-1) then Result:=-1 else Result:= tmpInt1*16+tmpInt2; end else Result:=-1; end; function GetMaxValue(x,y,x1,y1: Array of Double;len,len1: Integer): double;var i: Integer;begin result := 0; for i:=0 to l

23、en-1 do begin if abs(xi)result then result := abs(xi); if abs(yi) result then result := abs(yi); end; for i:=0 to len1-1 do begin if abs(x1i)result then result := abs(x1i); if abs(y1i) result then result := abs(y1i); end;end;/ 绘制飞行轨迹的函数 红色轨迹是载入的, 蓝色的轨迹是当前轨迹点 1. posXArray,posYArray 是当前轨迹点的坐标, posLeng

24、th是当前轨迹点的个数 2. posXArrayLoad,posYArrayLoad 是载入的轨迹点的坐标, posLengthLoad是载入的轨迹点的个数 procedure DrawAxis;var i,x,y,wid,h: Integer; pstep,ratio,maxV : double; can: TMetaFileCanvas;begin can := TMetaFileCanvas.Create(gpsMeta,0); /建立一个画布对象 gpsMeta.Width := Form1.ImgTrace.Width; /确定画布对应图像的大小 gpsMeta.Height :=

25、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); if maxV = 0 then maxV := 100; if maxV = 10 then begin maxV := 10

26、; end else if maxV = 100 then begin maxV := 100; end else if maxV = 200 then maxV := 200 else if maxV= 500 then maxV := 500 else if maxV = 1000 then begin maxV := 1000; end else if maxV= 2000 then maxV := 2000 else if maxV= 5000 then maxV := 5000 else if maxV = 10000 then begin maxV := 10000; end else if maxV= 50000 then maxV := 50000 else if maxV 0 then begin can.Pen.Color := clRed;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1