Delphi中利用MSCOMM控件进行GPS数据采集

2016-02-19 16:44 20 1 收藏

下面是个Delphi中利用MSCOMM控件进行GPS数据采集教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!

【 tulaoshi.com - 编程语言 】

  1、准备

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  GPS(Global Positioning System),即全球定位系统,利用24颗GPS卫星的测距和测时功能进行全球定位,在许多系统中,如机场导航系统,出租车辆管理和调度系统、江河流域的灾害信息管理和预测系统中,GPS得到了广泛的应用。本文利用MSCOMM控件实现了GPS数据的采集,可为信息管理和指挥调度等提供定位数据。

  本文采用GPS的异步串行传送方式,将GARMIN 12C按NMEA-0183协议输出的数据采集到了微机,并将接收到的地理坐标转换成为直角坐标。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  在DELPHI 5.0 IDE中新建一工程,名为GPSReceiver,在主界面上放置四个TEDIT控件,用于显示接收到的地理坐标和转换后的直角坐标,其name属性分别为:Editlatitude、Editlongitude、Editxcoord和Editycoord;在四个TEDIT控件下方放置三个按钮,用于数据接收的控制和退出程序,其Caption属性分别为接收、断开和返回;在界面上任意位置放置一个Ttimer控件、其属性interval值为1000,主要用于每隔一秒接收一次GPS数据;一个TMSCOMM控件。程序运行后的界面如图1所示:

  图1

  2、编写代码

  1) 在FORM的implementation部分添加以下声明

  

varnn,x,y,sm,n,weidud,jinchad,firstpxl,secondpxl,a,b,longitude,longitudemargin,latitude:double;weidustr,weidustrcpy,longitudestr1cpy,longitudestrccpy,weidustr1,weidustr2,jinchastr,jinchastr1,jinchastr2,longitudestr1,longitudestr11,longitudestr12,longitudestrc,longitudestrc1,longitudestrc2:string;gpsstrlist:tstringlist;gpsstr,gpsstrcpy:string;gpsstrlen:integer;

  2)在FORM的FORMSHOW事件中添加如下代码:

  

procedure Tmainfrm.FormShow(Sender: TObject);beginmscomm1.CommPort:=1; //默认串口1mscomm1.InBufferSize:=1024;mscomm1.Settings:='600,n,8,1'; //波特率为600if not mscomm1.PortOpen thenmscomm1.PortOpen:=true; //打开串口mscomm1.InBufferCount:=0;mscomm1.RThreshold:=512;mscomm1.InputLen:=0;timer1.Enabled:=false; //关闭定时器a:=6378245.0; b:=6356863.0; //参考椭球的长短轴firstpxl:=(a*a-b*b)/a/a; //第一偏心率secondpxl:=(a*a-b*b)/b/b; //第二偏心率end;

  3)为定时器Timer1添加OnTimer事件添加如下代码:

  

procedure Tmainfrm.Timer1Timer(Sender: TObject);vari:integer;tmpstr,strq,strq1,strq2,tmpstr1,tmpstr2:string;latitudestr,longitudestr:string;begini:=0;gpsstr:=mscomm1.input;gpsstrcpy:=gpsstr;while strlen(pchar(gpsstr))0 do begintmpstr:=copy(gpsstr,pos(#10,gpsstr),pos(#13,gpsstr)-1);delete(gpsstr,1,pos(#10,gpsstr));if copy(tmpstr,1,pos(',',tmpstr)-1)='$GPRMC' then begindelete(tmpstr,1,pos(',',tmpstr));//,strlen(pchar(tmpstr))-pos(',',tmpstr)+1);delete(tmpstr,1,pos(',',tmpstr));if copy(tmpstr,1,pos(',',tmpstr)-1)='A' then begindelete(tmpstr,1,pos(',',tmpstr));latitudestr:=copy(tmpstr,1,pos(',',tmpstr)-1);editlatitude.Text:='';strq1:=copy(latitudestr,1,2); strq2:=copy(latitudestr,3,6);editlatitude.Text:=strq1+'°'+strq2+'''';weidud:=strtofloat(copy(latitudestr,1,2))+strtofloat(copy(latitudestr,3,6))/60;weidud:=weidud*3.141592654/180;delete(tmpstr,1,pos(',',tmpstr));delete(tmpstr,1,pos(',',tmpstr));longitudestr:=copy(tmpstr,1,pos(',',tmpstr)-1);longitude:=strtofloat(copy(longitudestr,1,3))+strtofloat(copy(longitudestr,4,6))/60;editlongitude.Text:='';strq1:=copy(longitudestr,1,3); strq2:=copy(longitudestr,4,6);editlongitude.Text:=strq1+'°'+strq2+'''';jinchad:=abs(longitude-strtoint(centerlongitudestr));jinchad:=jinchad*3.141592654/180;end;break;end;end;n:=a/sqrt(1-firstpxl*sin(weidud)*sin(weidud));sm:=6367558.496*weidud-16036.48*sin(2*weidud)+16.828*  sin(4*weidud)-0.022*sin(6*weidud)+0.00003*sin(8*weidud);nn:=sqrt(firstpxl)*cos(weidud);x:=sm+n*sin(weidud)*cos(weidud)*jinchad*jinchad/2+n*jinchad*  jinchad*jinchad*jinchad*sin(weidud)*cos(weidud)*cos(weidud)*cos(weidud)*(5-    tan(weidud)*tan(weidud)+9*nn*nn+4*nn*nn*nn*nn)/24+n*power(jinchad,6)*  sin(weidud)*power(cos(weidud),5)*(61-58*tan(weidud)*tan(weidud)+tan(weidud)  *tan(weidud)*tan(weidud)*tan(weidud)+270*nn*nn*nn*nn-330*nn*nn*tan(weidud)*tan(weidud))/270; //纵坐标y:=n*jinchad*cos(weidud)+n*jinchad*jinchad*jinchad*cos(weidud)*cos(weidud)*cos(weidud)*(1-tan(weidud)*tan(weidud)+nn*nn)/6+n*power(jinchad,5)*power(cos(weidud),5)*(5-18*tan(weidud)*tan(weidud)+tan(weidud)*tan(weidud)*tan(weidud)*tan(weidud)+14*nn*nn-58*nn*nn*tan(weidud)*tan(weidud))/120; //横坐标editxcoord.Text:=formatfloat('00000.00',x);editycoord.Text:=formatfloat('00000.00',y);end;

  4)为按钮接收添加代码:

  

messagebeep(1);editlatitude.Text:=''; //接收前先清除显示内容editlongitude.Text:='';editycoord.Text:='';editxcoord.Text:='';timer1.Enabled:= true; //打开计时器

  5)为按钮断开添中代码:

  

messagebeep(1);editlatitude.Text:=''; //清除显示内容editlongitude.Text:='';editycoord.Text:='';editxcoord.Text:='';timer1.Enabled:= false; //关闭计时器

  6)为按钮返回添加代码:

  

procedure Tmainfrm.FormClose(Sender: TObject; var Action: TCloseAction);beginif application.MessageBox('您真的想退出吗?','GPS输入',mb_okcancel)=idok then begintimer1.Enabled:=false;if mscomm1.PortOpen thenmscomm1.PortOpen:=false;gpsstrlist.Free;action:=cafree;endelseaction:=canone;end;

  3、讨论

  本文利用MSCOMM控件成功地接收到了GPS的定位数据,效果良好,在实际应用中,由于GPS的数据处理比数据采集速度要慢,微机和GPS的通信有可能阻塞,且在系统中一台微机可能要接收多个GPS接收机的定位数据,所以应当考虑采用多线程机制,以避免资源冲突。

  本程序在Windows 2000(CHN)和DELPHI 5.0下通过。

来源:https://www.tulaoshi.com/n/20160219/1612938.html

延伸阅读
Delphi中TXMLDocument控件的用法      Delphi中对XML文件的解析做的很好,比直接使用MS的MSXML2_TLB中的接口要方便很&...
DELPHI中操作ACCESS数据库(建立.mdb文件,压缩数据库) 以下代码在WIN2K,D6,MDAC2.6下测试通过, 编译好的程序在WIN98第二版无ACCESS环境下运行成功. //声明连接字符串 Const SConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;' +'Jet OLEDB:Database Password=%s;&#...
     一直都听说delphi中画布使用简单方便。现在我就利用画布实现一个简单的树机构的图形表示。系统支持节点选择、移动、保存树、打开树等。为了实现的方便用到了递归与指针,虽然效率有点问题但是在快速解决问题还是蛮好的。   程序写的比较乱,欢迎交流:sss@pacia.com.cn   源代码如...
标签: Delphi
第一步:根据需要,用FrontPage或者Dreamweaver做一个界面,界面加上图片,还可加上漂亮的动态Flash。Web界面与程序事件联系在一起的地方就是“超链接”,我们以一个简单的播放器程序为例。 比如:要做一个播放器,有“播放”按钮和“停止”按钮,分别设置“播放”按钮的链接为“Play_”;“停止”按钮的超链接为“Stop_”。并保存这个网...
  unit USWLMSelectDa; {$S-,W-,R-}                                             ...

经验教程

899

收藏

28
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部