学以致用之GPS信息处理软件

发布者:Meshulun最新更新时间:2015-01-19 来源: 51hei关键字:GPS  息处理软件 手机看文章 扫描二维码
随时随地手机看文章

最近学了很多,也是时候自己做点东西来复习并且巩固下之前的知识了。学以致用最重要。最近写了个小软件,用来处理处理从窗口发送过来的GPS信息。GPS是与STM32相连接任何STM32把GPS信息发到电脑的串口上。任何我写了个C#的程序通过串口接收到信息,并对信息进行处理得到我们需要的经纬度,并通过经纬度查找到具体的地址。可以表达的不太清晰,想来几张图来个大家看看具体的效果。任何在讲讲具体的程序。

这是通过别的串口接收软件接收到的串口上的信息。


这是初始化状态下的软件界面

这是按了按钮之后的。由于经纬度查地址需要时间,所以地址不能马上的显示出来。

现在地址查询结束了。
然后我来介绍下程序。
首先需要先写程序来接收串口发过来的数据。
SerialPort sp = new SerialPort();首先我们可以实例化一个串口对象。
  sp.PortName = "COM8";   //端口
            sp.BaudRate = 38400;    //波特率
            sp.Open();              //打开串口
配置完端口和波特率后就可以打开串口来接收数据了
string message = sp.ReadLine();
                    message = message.Substring(0, message.Length - sp.NewLine.Length);
用这两句可以获得串口传来的数据并且保持在message字符串中。
我们刚才已经看过了传过来的字符串是什么格式的。它采用的是NMEA0183 协议,如果想具体了解它的协议可以去百度下,这里就不再赘述了。
由于我们只是需要经纬度,所以只需要对$GPGGA的数据进行处理。
经过观察我们可以使用,做为分割符来使用Split方法进行分割字符串
然后转换成我们需要的信息。
这里附上程序:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        SerialPort sp = new SerialPort();
   
        //private void button1_Click(object sender, EventArgs e)
        //{
        //    //sp.Close();
        //    sp.PortName = "COM8";
 
        //    sp.BaudRate = 38400;
        //    sp.Open();
 
        //}
 
        private void Form1_Load(object sender, EventArgs e)
        {
          
 
 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            
            sp.PortName = "COM8";   //端口
            sp.BaudRate = 38400;    //波特率
            sp.Open();              //打开串口
            bool stop = false;      //标志位
 [page]
           
           
            string longitude = "0";//经度
            string latitude = "0";//纬度
       
            
            while (!stop)
            {
                try
                {
                    string message = sp.ReadLine();
                    message = message.Substring(0, message.Length - sp.NewLine.Length);
                    if (message.StartsWith("$GPGGA"))
                    {
                        //模拟定位
                        //message = "$GPGGA,012440.00,2232.458380,N,11356.91024,E,1,05,2.7,40.2,M,0.5,M,,*6F";
                        //message = "$GPGGA,012440.00,2232.301654,N,11402.058366,E,1,05,2.7,40.2,M,0.5,M,,*6F";
                        char[] separator = { ',' };
                        string[] data = message.Split(separator);
                        if (data[6].Equals("1"))
                        {
                            string s;
                            s = data[2];
                            int idx = s.IndexOf(".");
                            string d1 = s.Substring(0, idx - 2);
                            string d2 = s.Substring(idx - 2);
                            double degree = Double.Parse(d1) + Double.Parse(d2) / 60;
 
 
                            latitude = Convert.ToString(Convert.ToDouble(s) / 100);//纬度
                            string j;
                            j = data[4];
                            int idxj = j.IndexOf(".");
                            string d1j = j.Substring(0, idxj - 2);
                            string d2j = j.Substring(idxj - 2);
                            double degreej = Double.Parse(d1j) + Double.Parse(d2j) / 60;
                           
                            longitude = Convert.ToString(Convert.ToDouble(j)/100);//经度                
                           
                        
                       
                           
                            
                            textBox1.Text = longitude;
                            textBox2.Text = latitude;
                            
                            stop = true;
                        }
                        else
                        {
                           
                            sp.Close();
                            sp.PortName = "COM8";
 
                            sp.BaudRate = 38400;
                            sp.Open();
                           // button2_Click(button2,EventArgs e);
                        }
                    }
                    else if (message.StartsWith("$GPGGA"))
                    {
                        char[] separator = { ',' };
                        string[] data = message.Split(separator);
                      
                    }
 
                }
                catch (TimeoutException) { }
                
            }
           
                
                    sp.Close();
                   // sp = null;
                    //textBox4.Text = adrss();2
                    MessageBox.Show("GPS已停止,请等待地址信息的查询!");
                   
                    textBox4.Text = GPSadrss.adrss(latitude, longitude);
 
 
        }
在获得了经纬度之后我们需要用经纬度来查询地址。我在这里定义了一个GPSadrss的类,并且在里面定义了一个static类型的adrss方法。这样我们不需要实例化GPSadrss对象也可以调用adrss方法了。
adrss里我们使用来谷歌的接口来查询地址。
class GPSadrss
    {
        public static string adrss(string latitude, string longitude)
        {
            WebClient client = new WebClient();//webclient客户端对象
            //string url = "http://maps.google.com/maps/api/geocode/xml?latlng=29.82121,121.55973&language=zh-CN&sensor=false";//请求地址
 
            string url = "http://maps.google.com/maps/api/geocode/xml?latlng="+latitude+","+longitude 
                +"&language=zh-CN&sensor=false";//请求地址
            client.Encoding = Encoding.UTF8;//编码格式
            string responseTest = client.DownloadString(url);//下载xml响应数据
 
            XmlDocument doc = new XmlDocument();//创建XML文档对象
 
            if (!string.IsNullOrEmpty(responseTest))
            {
                doc.LoadXml(responseTest);//加载xml字符串
 
                //获取状态信息
                string xpath = @"GeocodeResponse/status";
                XmlNode node = doc.SelectSingleNode(xpath);
                string status = node.InnerText.ToString();
 
                if (status == "OK")
                {
                    //获取地址信息
                    xpath = @"GeocodeResponse/result/formatted_address";
                    node = doc.SelectSingleNode(xpath);
                    string address = node.InnerText.ToString();
 
                 
                   string[]ad= address.Split();
                    return ad[0];
 
                }
                return "false";
            }
            return "false";
        }
这是GPSadrss里面的代码。这里用了webclient客户端对象来访问谷歌的端口。
然后说下界面的设计,由于经纬度和地址,我们都希望不能由用户直接输入使用我们需要把3个文本框的ReadOnly属性设计为ture;

 

由于我们也不希望用户任意的拉伸窗口所以我把边框样式设置成了Fixed


并且把窗口的最大化按钮去掉了 


现在的程序还很粗糙,离我的目标还有些差距。比如这个版本的程序在点击了按钮只后等待查询地址的时候程序假死在那里了,直到查到了地址我们才能继续控制它,这里我觉得是因为在查地址的时候程序一直在等待网页上传来的数据。所以程序假死。下个版本的目标是用线程来查询地址,就可以解决这个问题了。
关键字:GPS  息处理软件 引用地址:学以致用之GPS信息处理软件

上一篇:5V/3V IO的简易匹配
下一篇:C语言关键字-static

推荐阅读最新更新时间:2024-03-16 13:51

嵌入式GPS语音导航系统中MP3的解码与播放
0 引言     近年来,电子技术的迅猛发展,使得嵌入式系统在越来越广泛的领域得到应用。嵌入式系统平台的功能也越来越强大,复杂度也越来越高,同时对其开发的难度和要求也越来越高。在开发过程中需要将应用软件和系统软件作为一个整体考虑,而且软件和硬件的联系也更加密切。所以,嵌入式系统的开发是一个复杂的过程。随着嵌入式系统性能的大幅度提高,老式的GPS导航仪已开始向嵌入式方向发展。嵌入式GPs导航仪已越来越便携,功能越来越强大,语音导航和媒体功能已成为嵌入式GPS导航仪的一大突出的亮点。所以,MP3音频解码与播放技术现已成为嵌入式GPS导航系统中的一项基本技术。MP3的全称是MPEG Audio Layer 3,是目前流行的一种音频编
[嵌入式]
低噪声放大器在手机GPS上的应用
早在2001年911恐怖事件以后,美国基于安全的考虑,强制要求手机具有GPS定位功能,以确定该手机的实时位置。近年来,随着我国基础建设的迅猛发展,道路建设日新月异;人们工作生活节奏加快,GPS导航定位系统日显重要,需求增加。最近有消息称:诺基亚高调宣布为其智能手机推出了Ovi地图新版本,将包括高端的步行和驾驶导航。此举被视为对GPS手机导航产业以及GPS导航相关产业影响巨大的变革。随着手机性能的普遍提升,以及手机GPS接收机独特问题的解决,GPS功能已不再是高端手机独享的配置,正在向普通手机标配发展。 GPS功能简介 GPS全称为全球定位系统,由24颗卫星分布在6个不同高度的轨道上,按功能分有导航和定位两个;
[网络通信]
低噪声放大器在手机<font color='red'>GPS</font>上的应用
宇达电通将推出划时代的GPS导航软件产品
      根据赛迪顾问2008年末发布的市场调研报告,全球经济虽受美国金融危机影响形势低迷,但国内GPS产业却逆势走强,复合增长率高达34.3%。这一数据对业内人士来说不啻是一剂强心针,但欣喜之余也掺杂着几分隐忧,尤其是市面上大量出现的廉价山寨机和白牌机对正规GPS市场带来的疯狂冲击以及对消费者权益的影响。       MIO宇达电通作为全球领先GPS领导厂商,凭借对产业的深刻洞察及数年来在全球市场的成功经验,独辟蹊径在竞争中开辟蓝海。综观当前复杂的经济形势和GPS产业发展趋势,宇达电通认为创新才是硬道理,只有创新才能成就未来。 车载GPS市场亟待创新突破   近几个月来,金融危机大有愈演愈烈之势。由于经济发展不乐
[汽车电子]
基于ARM的车载GPS智能导航系统
1 引言 ARM 随着中国的城市化的程度不断加快,使得越来越多的人口与事业单位集中在一个“狭小”范围内生活与工作。城市的迅速“膨胀”直接导致了交通 网络 的日趋复杂,人员流动的日益频繁也使得每个人对空间信息有了更多的依靠。人们更加关心“当前我在哪里?”“目的地在哪里?”“如何到达?”等问题。而以嵌入式系统为平台的数字地理集成应用方案可以有效地解决这些矛盾。在此背景下,本文给出了基于 ARM 的嵌入式解决方案。 字串4 2  硬件实现 本嵌入式 GPS 导航系统的硬件核心是三星公司 ARM9 系列中的 16/32 位 RISC 处理器 S3C24
[单片机]
基于ARM的车载<font color='red'>GPS</font>智能导航系统
基于GPS的航标遥测系统数值优化方法
  随着电子技术和通信技术的发展,无线通信以及遥测遥控系统被广泛应用于工业、农业、航空、航海等各个领域中。出海口及内陆河道作为航海航运重要的一部分,其管理维护方法及管理质量对我国航运业的影响至关重要。发展至今,电子通信产品的可靠性越来越高,成本越来越低,这使得航道管理维护自动化、数字化的实现成为可能。GPS(全球定位系统)是美国国防部于1973年开始研制的卫星全球导航定位系统,主要为其海陆空三军服务。近几年来已逐步应用于民用设施及测绘技术中,同时美国军方逐步放松对民用GPS设备的限制,使得民用GPS达到了比较高的定位精度。利用GPS对航道航标等设备进行位置遥测与监控是一种比较理想的方法。本文以航标监控的具体要求为标准,把整个航道管理
[测试测量]
基于<font color='red'>GPS</font>的航标遥测系统数值优化方法
BAE Systems完成对柯林斯军事GPS业务的收购
BAE Systems已正式从雷神技术公司收购了柯林斯航空军事全球定位系统(GPS)业务。BAE System于1月宣布以19亿美元收购该项业务,以增强现有BAE Systems电子系统产品组合,增加了GPS抗干扰和防欺骗技术,该技术可对导航和制导进行支持。 柯林斯军事GPS业务总部位于爱荷华州,拥有大约700名员工。 据BAE Systems称,柯林斯军事GPS业务在全球以成功进入280多个机载设备,地面和武器系统平台上已安装了超过150万台,它还在为美国军方开发下一代GPS技术。 据报道,出售柯林斯全球定位系统业务是雷神公司与联合技术公司合并中反托拉斯监管要求的一部分。
[传感器]
ESD保护解决问题:每次一个汽车模块
在一天的工作正式开始前,粗略地浏览电子邮件,看到一连串报价、样品、项目和其他要求。对我来说,总是突颖而出的一个要求通常包含“帮助”和“ESD”两个词。这特殊的请求是在艰难的时刻产生,然而我忍不住笑了,因为这对一个ESD保护器件的制造商恰好是绝佳商机。 静电放电(ESD)可能发生在电绝缘的物体,如一个人由于摩擦而带电和在接触到接地金属物体时突然放电。静电电位可高达30 kV,而由此产生的放电是非常短的,通常为100 ns,峰值电流可高达100 A。我们都以不同的形式经历过ESD,当我们走路回家触摸门把手时产生静电,随后被电到。这可能会瞬间疼痛,能量通过空气切割的轻微的蓝色火花用科学解释“相当酷”。但想象一下,当您从车里出来,靠在
[汽车电子]
OnStar最新监测系统出招,被盗的车辆会自动减速!
一些车贼可能会对以下内容感到吃惊!当他们驾驶盗窃的车辆被警察追逐时,被盗车辆会自动减速。 OnStar发布了一种新的被盗车辆服务,它容许安全顾问通过发出遥控信号让引擎的燃油流动减少,从而使被盗车辆减速。该公司表示,其顾问可能不久将与法律强制权力机构一道工作,并向被盗车辆发出信号,以便这些被盗车辆将逐渐减速。 该服务将在一些通用汽车的2009车型上亮相。大约160万辆汽车,其中,大约2/3是雪佛兰牌汽车,将配备这种服务。驾驶员必须报告发生了盗窃,然后,呼叫OnStar请求被盗车辆定位辅助系统,该系统依赖于GPS实现精确的跟踪。一旦警察锁定了该车,他们就能够要求OnStar顾问遥控减速。OnStar公司表示,它拥有安全装置以确保顾
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved