none
內建GPS資料讀取問題 RRS feed

  • 問題

  • 我有參考了一下其他文章,不過還是沒辦法解決我的問題,所以才上來問>"<
    最近我新買了一個PDA手機P565(Mobile 6.1),它內建GPS,
    我有開啟看過它連結GPS的PORT為COM2,後GPS連接埠我設定為COM6
    我自己寫了以下程式想去抓取GPS的資料,但一直都失敗無法抓取到任何資料

    private void button1_Click(object sender, EventArgs e)
            {
                SerialPort sp;
                sp = new SerialPort();
                listBox1.Items.Clear();
                sp.PortName = comboBox1.Text;      =>這邊是選取COM的部份
                sp.Parity = Parity.None;
                sp.BaudRate = 4800;
                sp.StopBits = StopBits.One;
                sp.DataBits = 8;
                //sp.Handshake = Handshake.None;
                sp.ReadTimeout = 2500;
                try
                {
                    sp.Open();
                    //byte[] bData = new byte[256];
                    //sp.Read(bData, 0, 256);
                    string sData = sp.ReadLine();
                    //foreach (byte bb in bData)
                    //{
                    //    if (sData == "")
                    //        sData += bb.ToString();
                    //    else
                    //        sData += ","+bb.ToString();
                    //}
                    listBox1.Items.Add(sData);
                }
                catch (Exception ex)
                {
                    listBox1.Items.Add(ex.Message);
                    sp.Close();
                }

            }
    我用COM1和COM2作讀取都會在sp.Open()這邊跳錯,是說COM不存在及指定通訊埠名稱無效
    用COM3,COM4,COM5,COM6都是在(string sData=sp.ReadLine)作業過時。(註解部分一樣在sp.Read(bData,0,256)這邊錯誤)

    我有試著把GPS設定那邊輪流開關過,不過依然一樣抓不到資料,
    我是用visual Studio2008 C#寫的,當時新建方案時沒注意,應該是.net Compact Framework Version3.5寫的。

    麻煩各路高手伸出援手QQ~~~

    ps.補充一下,確定GPS可以接收的到~用Garmin Mobile XT很快就抓到訊號定位了

    2009年3月17日 上午 10:12

解答

  • 建議你先看一下GPS原理跟GPS訊息格式(NMEA),對於你開發GPS應用程式會很有幫助
    GPS介紹
    NMEA介紹

    另外,你可以直接修改Windows Mobile 6.0 SDK裡面的範例,直接拿來用就可以省掉自己找port的動作。
    只要把其中幾個類別加到你的專案中,再引用Microsoft.WindowsMobile.Samples.Location命名空間即可。
    省事又方便~

    這一篇順便也給你參考
    http://msdn.microsoft.com/zh-tw/cc964133.aspx
    發問請詳述,解決請標解答,方便後人查詢 - 葉佰蒼 JanYeh - MVP For Device Application Development
    2009年8月8日 下午 05:12

所有回覆

  • Hi,
    ReadLine會等待"換行字元"產生,也就是0x0D、0x0A,如果一直沒有收到這個的話就會等到Timeout為止,你要確定你的GPS是會送出這樣的訊號才能用ReadLine;anyway,我覺得你用Read指令去收,收到byte陣列這樣會比較準,你可以修改一下程式碼,測試看看。
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年3月17日 下午 12:30
    版主
  • 我有試過了~用Read後,COM3-COM6部份依然是到sp.read(bData,0,256)這邊跳catch
    所以應該不是這問題@@

    2009年3月18日 上午 01:06
  •  之前在這個版上我有貼一個去掃GPS的COM號碼的程式,是VB的,之前在我的機子上可以抓到,你先測試看看是不是能動。

    http://social.msdn.microsoft.com/forums/zh-TW/803/thread/efc4346b-418a-49a7-90f9-f9d32fb90f3d/
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年3月18日 上午 02:06
    版主
  • bauann大大你之前的碼我有用過了,依然沒辦法,不過當初我是有改動使用。
    剛剛我把你的碼翻成C#來用結果還是一樣,都抓不到資料,因此掃的結果都是找不到GPS。
    我轉過來的碼如下:
    listBox1.Items.Clear();
               
                foreach (string portname in SerialPort.GetPortNames())
                {
                    if (portname == "COM4")
                        continue;
                    SerialPort sp = new SerialPort(portname, 4800, Parity.None, 8, StopBits.One);
                    //sp.PortName = portname;
                    //sp.BaudRate = 4800;
                    //sp.Parity = Parity.None;
                    //sp.DataBits = 8;
                    //sp.StopBits = StopBits.One;
                    bool isGPS = false;
                    sp.Handshake = Handshake.None;
                    sp.ReadTimeout = 2500;
                    Byte[] bb = new Byte[256];
                    string sData = "";
                    try
                    {
                        sp.Open();
                        System.Threading.Thread.Sleep(200);
                        int rData = sp.Read(bb, 0, bb.Length);
                        if (rData > 0)
                        {
                            sData = Encoding.ASCII.GetString(bb, 0, rData);
                            if (sData.StartsWith("$GP") || sData.IndexOf("GP") > 0)
                            {
                                isGPS = true;
                            }
                        }
                        sp.Close();
                    }
                    catch (Exception ex)
                    {
                        listBox1.Items.Add(portname + " " + ex.Message);
                        if (sp.IsOpen)
                        {
                            sp.Close();
                        }
                    }
                   
                    if (isGPS)
                        listBox1.Items.Add(sp.PortName + " Find Port");
                    else
                        listBox1.Items.Add(sp.PortName + " Not Find");
                }

    COM1,COM2都是一樣情況,COM3,COM5,COM6為作業過時。
    COM4反倒是怪怪的....讀到他就會當掉=.=??因此我後來加入判斷忽略它。

    不過總的來說結果不變,我還是沒讀到資料。

    但是我用單一port選取測試時(上方原始碼部份)發現有不一樣的地方式COM3和COM6讀資料第一次不會跳Catch了,
    但是讀到資料為""。第二次再讀就會跟我說找不到COM。


    2009年3月18日 上午 06:59
  • Hi,
    跟你對一下外部GPS的設定

    "程式集"頁籤 --- 這是讓所有需要用到GPS的軟體存取用的


    "硬體"頁籤 --- 這個是實際GPS硬體所在的PortName,我是用papago去看的


    "存取"頁籤 --- 這個選項要勾起來,不然會沒有辦法share gps的資料
    • 已編輯 bauannModerator 2009年3月23日 下午 04:40 修正圖檔連結
    2009年3月23日 下午 04:33
    版主
  • 不好意思~前一陣子在忙其他事情,所以停了一陣子。這陣子重新開始摸索@@a...
    我後來有查了一下,上網有找到用Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS裡面的sample測試,發現便可以抓到GPS訊號了。
    我有打開他的碼稍微看了一下,感覺跟我的寫法不一樣,他沒用到設定comport...而是直接取資料(不知我的想法有沒有錯??)
    所以我用string str = serial_port.ReadLine();取他資料便取不到資料還跳錯。

    不過因為他的碼用了些C++類的寫法,有點看不太懂.....
    而且他讀取方式感覺也不是拆解
    "$GPRMC,022644.000,A,2503.6201,N,12130.7858,E,0.02,14.24,290709,,*33\r"
    "$GPGGA,022645.000,2503.6201,N,12130.7857,E,1,04,1.4,60.8,M,15.1,M,,0000*6C\r"
    "$GPGSA,A,3,32,16,22,26,,,,,,,,,2.9,1.4,2.5*39\r"
    這一類的資訊了,但還是感謝之前回我的大家的幫助!

    現在想再問個問題,因為看他讀取的碼看不太懂如何讀的,
    我假如想讀到原來$GPGSV裡面的資料,內建GPS那邊讀取可以讀的到嗎@@?(因為我看不太懂他讀取的碼)


    2009年7月29日 上午 07:08
  • 建議你先看一下GPS原理跟GPS訊息格式(NMEA),對於你開發GPS應用程式會很有幫助
    GPS介紹
    NMEA介紹

    另外,你可以直接修改Windows Mobile 6.0 SDK裡面的範例,直接拿來用就可以省掉自己找port的動作。
    只要把其中幾個類別加到你的專案中,再引用Microsoft.WindowsMobile.Samples.Location命名空間即可。
    省事又方便~

    這一篇順便也給你參考
    http://msdn.microsoft.com/zh-tw/cc964133.aspx
    發問請詳述,解決請標解答,方便後人查詢 - 葉佰蒼 JanYeh - MVP For Device Application Development
    2009年8月8日 下午 05:12