久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

學以致用之GPS信息處理軟件

作者:黑馬   來源:黑馬程序員的空間   點擊數:  更新時間:2014年05月23日   【字體:

最近學了很多,也是時候自己做點東西來復習并且鞏固下之前的知識了。學以致用最重要。最近寫了個小軟件,用來處理處理從窗口發送過來的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;      //標志位
 
           
           
            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


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


現在的程序還很粗糙,離我的目標還有些差距。比如這個版本的程序在點擊了按鈕只后等待查詢地址的時候程序假死在那里了,直到查到了地址我們才能繼續控制它,這里我覺得是因為在查地址的時候程序一直在等待網頁上傳來的數據。所以程序假死。下個版本的目標是用線程來查詢地址,就可以解決這個問題了。
關閉窗口

相關文章

主站蜘蛛池模板: 国产欧美日韩在线 | 久久成人高清视频 | 综合久久综合久久 | 日本粉嫩一区二区三区视频 | 欧美一区视频 | 日韩中文字幕一区 | 亚洲国产欧美日韩 | 日韩天堂av | 日韩欧美中文字幕在线观看 | 欧美一级α片 | 中文天堂在线一区 | 99re热精品视频 | 欧美激情视频一区二区三区在线播放 | 美女福利网站 | 精品丝袜在线 | 99精品视频一区二区三区 | 欧美日韩大片 | 色综合久久久久 | 欧美激情国产日韩精品一区18 | 亚洲精品国产一区 | 久久亚洲二区 | 国产精品99久久久久久大便 | 自拍偷拍中文字幕 | 久久精品亚洲精品国产欧美 | 日本亚洲精品成人欧美一区 | 国产精品视频一二三区 | 涩爱av一区二区三区 | 国产精品三级久久久久久电影 | 国产免费一区 | 人人擦人人干 | 日日骑 | 欧美日韩在线精品 | 91视频在线网站 | 亚洲一视频 | 久草院线| 国产精品乱码一区二三区小蝌蚪 | 91在线精品秘密一区二区 | 亚洲一区二区三区视频在线 | 99色综合 | 在线一区 | 古典武侠第一页久久777 |