<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> 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


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


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

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮