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

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

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

  2、编写代码

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

var
nn,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);
begin
mscomm1.CommPort:=1; //默认串口1
mscomm1.InBufferSize:=1024;
mscomm1.Settings:='600,n,8,1'; //波特率为600
if not mscomm1.PortOpen then
mscomm1.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);
var
i:integer;
tmpstr,strq,strq1,strq2,tmpstr1,tmpstr2:string;
latitudestr,longitudestr:string;
begin
i:=0;
gpsstr:=mscomm1.input;
gpsstrcpy:=gpsstr;
while strlen(pchar(gpsstr))>0 do begin
tmpstr:=copy(gpsstr,pos(#10,gpsstr),pos(#13,gpsstr)-1);
delete(gpsstr,1,pos(#10,gpsstr));
if copy(tmpstr,1,pos(',',tmpstr)-1)='$GPRMC' then begin
delete(tmpstr,1,pos(',',tmpstr));//,strlen(pchar(tmpstr))-pos(',',tmpstr)+1);
delete(tmpstr,1,pos(',',tmpstr));
if copy(tmpstr,1,pos(',',tmpstr)-1)='A' then begin
delete(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);
begin
if application.MessageBox('您真的想退出吗?','GPS输入',mb_okcancel)=idok then begin
timer1.Enabled:=false;
if mscomm1.PortOpen then
mscomm1.PortOpen:=false;
gpsstrlist.Free;
action:=cafree;
end
else
action:=canone;
end;

  3、讨论

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

Delphi利用MSCOMM控件进行GPS数据采集相关推荐

  1. 利用MSCOMM控件通过串口MODEN实现来电显示-c# source code

    利用MSCOMM控件通过串口MODEN实现来电显示-c# source code 注:此代码都已调试通过 处理方式 MSComm控件提供了两种处理通信的方式:一种为事件驱动方式,该方式相当于一般程序设 ...

  2. 在 Wi ndows,MSComm控件在中文Wi的ndows下的通信问题与处理方法.doc

    MSComm控件在中文Wi的ndows下的通信问题与处理方法 MSComm控件在中文Windows下的通信问题与处理方法 摘 要VB 5.0/6.0的MSComm通信控件提供了一系列标准通信命令的接口 ...

  3. 串口MSComm控件五种不同校验方式对数据收发的影响

    (2008-09-10 14:50:00)   http://blog.sina.com.cn/s/blog_470eccc60100arq7.html   串口MSComm控件有五种校验方式,分别是 ...

  4. 自动注册MSComm控件

    MSComm通信控件具有丰富的与串口通信密切相关的属性及事件,提供了一系列标准通信命令的接口,可以用它创建全双工的.事件驱动的.高效实用的通信程序.这里将介绍如何把用MSComm这个ActiveX控件 ...

  5. 串口通讯mscomm控件下载

    串口通讯mscomm控件下载 大家知道,当我们安装VC++6.0/VB6.0时,如果选择了ACtiveX控件项(自定义安装),MSComm控件就会自动安装在计算机上了,并在系统文件夹下多了3个文件:M ...

  6. Windows串口通信有关的MSComm控件

    问题描述:一般单片机.ARM.FPGA一类的板子基本都会带有RS232串口,因为协议简单,而且成熟,有许多现成的东西可以借鉴使用.在上位机通过串口获取下位机传来的信息或数据,Windows下一般有(1 ...

  7. 利用tab_control控件在对话框中加入属性页的方法详细介绍

    在对话框中加入属性页 方案一 在对话框上放置一个Tab Control的控件,再在对话框上放置所需的控件(本例放置了2个按钮,试图在每个标签中显示一个).然后利用Class Wizard来为Tab C ...

  8. VC基于MSCOMM控件串口通讯

    在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem). 还可以发送命 ...

  9. ASP中利用OWC控件实现图表功能详解[zz]

    ASP中利用OWC控件实现图表功能详解 在ASP中利用OWC(Office Web Components)控件可轻松实现各种图表功能,如饼图,簇状柱型图,折线图等. 在下面的代码中我详细的给出了饼图, ...

最新文章

  1. 想念一个人是一种温馨,被别人想念是一种幸福
  2. 万物皆可Graph | 当信息检索遇上图神经网络
  3. mysql 每组取一条_MySql分组后随机获取每组一条数据的操作
  4. Java基础(六)——容器
  5. Windows Phone 的字体和语言配置支持
  6. 算法设计与分析基础(第3版)
  7. 如何撰写专利说明书摘要?
  8. 前端模块打包工具--webpack
  9. Android源代码中引用@hide类出现引用异常的问题error: cannot find symbol
  10. IDEA 顶部导航栏(Main Menu)不见了怎么办?
  11. 埃默里大学有计算机专业吗,埃默里大学计算机科学硕士排名第30(2020年TFE Times排名)...
  12. AcWing 1145. 北极通讯网络 题解
  13. UNIX时间戳的应用-JAVA
  14. OBS Studio软件及多端推流插件的安装教程
  15. STM32F7--->串口相关,串口的所有寄存器详讲
  16. 一加点击android系统时间,一加6手机系统迎来更新,一加让你快速吃“派”
  17. 小程序坑爹玩意儿的 U.createEvent is not a function报错问题汇总
  18. 关于“大局观”的一些思考
  19. 电子计算机发展飞速还是迅猛,多媒体技术在小学语文教学中的应用
  20. IDEA-Stram调试

热门文章

  1. 【整理】各种语言的API文档
  2. jsp,最常用的3个知识点
  3. HDU 1175 连连看(BFS)
  4. NYOJ 303 序号转换 数学题
  5. NYOJ 6 喷水装置(一) 贪心算法 之 区间覆盖问题
  6. 使用QSerialport读取串口数据并处理
  7. 使用fiddler进行app弱网测试
  8. Windows删除指定时间之前指定后缀名的文件
  9. Python - 按天算年龄
  10. Kafka- Spark消费Kafka