none
在PDA上開發GPS的程式問題 RRS feed

  • 問題

  • 想請教一下各位大大

    我現在要用C#寫GPS的程式,我想請問一下,我這樣寫為什麼會錯

     

     

    SerialPort sp = new SerialPort("COM1", 4800, Parity.None);

            private void button1_Click(object sender, EventArgs e)
            {
                sp.Open();
            }

     

    然後程式run完就說sp.Open();出錯,我想請問一下是什麼原因,我是用內建的GPS,有安裝papago,請問這樣會有影響嗎?

    還想請問一下其他問題

    1.我要怎麼知道內建的GPS用的是哪一個port

    2.sp = new SerialPort("COM1", 4800, Parity.None);這一句是GPS和衛星傳輸的port,還是機器本身和外接的GPS連接的port

    3.衛星定位多久會改變一次和4800這個數值有關嗎

     

    請各位大大幫忙解惑一下了,謝謝。

    2008年5月16日 下午 06:08

解答

  • Hi,

    你有用"外部GPS"的功能嗎?沒有的話應該只有一個COM會有作用的才對;我做了一個簡單的掃描程式,你可以參考看看,Form上面有一個TextBox

    Code Snippet

    Imports System.IO.Ports

    Imports System.Text

     

    Public Class Form1

     

        Dim strPortName As String = ""

        Dim strTmp As String = ""

        Dim B(199) As Byte

        Dim intReturn As Integer = 0

     

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            SerialPort1.BaudRate = 4800

            SerialPort1.DataBits = 8

            SerialPort1.Handshake = Handshake.None

            SerialPort1.StopBits = StopBits.One

            SerialPort1.Parity = Parity.None

            SerialPort1.ReadTimeout = 2500

            For Each s As String In SerialPort.GetPortNames

                SerialPort1.PortName = s

                Try

                    SerialPort1.Open()

                    Threading.Thread.Sleep(200)

                    intReturn = SerialPort1.Read(B, 0, B.Length)

                    If intReturn > 0 Then

                        strTmp = Encoding.ASCII.GetString(B, 0, intReturn)

                        If strTmp.IndexOf("$GP") >= 0 Then

                            strPortName = SerialPort1.PortName

                            TextBox1.Text = strTmp

                        End If

                    End If

                    SerialPort1.Close()

                Catch ex As Exception

                    If SerialPort1.IsOpen Then SerialPort1.Close()

                End Try

            Next

        End Sub

    End Class

     

     

    另外用ReadLine或是ReadExisting會讀不到東西,要實際去下Read或ReadByte的指令。

    2008年5月18日 上午 07:43
    版主

所有回覆

  • Hi,

    你要確定一下,Port Name是不是COM1,可能你的PDA上面沒有COM1;4800是Baudrate,資料在傳輸的速度,這跟衛星定位沒有直接的關係,主要是用來定義跟GPS Module之間資料傳輸的速度是多少。

    怎麼去看Port是多少,我知道的有兩個方式,一個是用其他的軟體去看,比如說Papago,或者是自己去掃描,從COM1開到COM10,配合Try..Catch,去嘗試開啟COM Port,開的起來的話去收取資料並判斷是不是GPS的資料。

     

    2008年5月17日 上午 03:05
    版主
  • 我確定我的PDA上有COM1,我用papago的時候都是用COM1去接收GPS值,這樣代表這台機器接收GPS直是用COM1嗎?我檢視過我的Port有COM1、COM2、COM3、COM8、COM9,使用COM1和COM8的時候,程式run會有IOException的錯誤,使用COM9的時候不會壞帶也沒什麼反應,請問我現在應該怎麼做才對,內建的GPS要怎麼寫成能接聲GPS值阿,我到底是哪裡錯了呢,請各位大大幫忙,謝謝各位了。

     

    2008年5月17日 下午 01:29
  • IOException是怎麼樣的錯誤?有錯誤訊息嗎?如果你確定有COM1的話,那再確認看看是不是有其他的程式開啟了,一般在開啟COM的部分都是獨佔的,一個程式開了另一個程式就不能開啟了。

    2008年5月17日 下午 02:57
    版主
  • 如果說我有一支程式是用到COM1,但我現在沒有開啟它,這樣會有佔掉port的問題嗎?

     

    錯誤訊息就如下:

    System.IO.IOException 未處理
      Message="IOException"
      StackTrace:
        於 System.IO.Ports.SerialStream.WinIOError()
        於 System.IO.Ports.SerialStream..ctor()
        於 System.IO.Ports.SerialPort.Open()
        於 DeviceApplication5.Form1.button2_Click()
        於 System.Windows.Forms.Control.OnClick()
        於 System.Windows.Forms.Button.OnClick()
        於 System.Windows.Forms.ButtonBase.WnProc()
        於 System.Windows.Forms.Control._InternalWnProc()
        於 Microsoft.AGL.Forms.EVL.EnterMainLoop()
        於 System.Windows.Forms.Application.Run()
        於 DeviceApplication5.Program.Main()

     

    原程式碼如下:

     

        public partial class Form1 : Form
        {
            SerialPort sp = new SerialPort("COM1", 4800, Parity.None, 8, StopBits.One);
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)//這一塊列出有哪些port
            {
                string[] ports = SerialPort.GetPortNames();
                string MsgString;
                MsgString = "以下是可用的port:" + "\r\n";
                listBox1.Items.Clear();
                foreach (string port in ports)
                {
                    MsgString = MsgString + port + "\r\n";
                    listBox1.Items.Add(port);
                }
            }

            private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    sp.Open();
                    timer1.Enabled = true;
                }
                catch (IOException ex)
                {
                    MessageBox.Show(ex.GetType().Name.ToString());
                    MessageBox.Show(ex.ToString());
                }

            }

            private void timer1_Tick(object sender, EventArgs e)
            {
                string str = "";
                try
                {
                  
                    str = serialPort1.ReadLine();
                    textBox1.Text += str + "\r\n";
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

            private void button4_Click(object sender, EventArgs e)
            {
                timer1.Enabled = false;
            }
           
        }

     

    請多指教了謝謝。

    2008年5月17日 下午 05:13
  • 通常COM1會被系統常用的應用佔走,所以建議你用COM3以後的Port試看看。

    2008年5月17日 下午 05:20
  • Hi,

    程式沒有開的話不會占用資源;我剛剛開了我的papago來看,在gps設定那邊,雖然是顯示COM1、4800;但是這時候不代表是在用COM1喔,上面設定的地方是設定成"自動偵測",你把它改成"手動設定"去測試就可以看出差別了。

     

    2008年5月17日 下午 05:29
    版主
  • 我測出來用papago手動連結可以運行的是COM1和COM8,但兩個用自己的程式執行時就無法開啟。

    使用papago時PDA上方的藍色燈會亮,用自己的程式就沒有亮,是不是代表我開啟COM1,但那個COM1根本就沒有運作,所以程式就會出錯阿?如果是的話要怎麼讓連接GPS?

     

    2008年5月17日 下午 06:25
  • Hi,

    你有用"外部GPS"的功能嗎?沒有的話應該只有一個COM會有作用的才對;我做了一個簡單的掃描程式,你可以參考看看,Form上面有一個TextBox

    Code Snippet

    Imports System.IO.Ports

    Imports System.Text

     

    Public Class Form1

     

        Dim strPortName As String = ""

        Dim strTmp As String = ""

        Dim B(199) As Byte

        Dim intReturn As Integer = 0

     

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            SerialPort1.BaudRate = 4800

            SerialPort1.DataBits = 8

            SerialPort1.Handshake = Handshake.None

            SerialPort1.StopBits = StopBits.One

            SerialPort1.Parity = Parity.None

            SerialPort1.ReadTimeout = 2500

            For Each s As String In SerialPort.GetPortNames

                SerialPort1.PortName = s

                Try

                    SerialPort1.Open()

                    Threading.Thread.Sleep(200)

                    intReturn = SerialPort1.Read(B, 0, B.Length)

                    If intReturn > 0 Then

                        strTmp = Encoding.ASCII.GetString(B, 0, intReturn)

                        If strTmp.IndexOf("$GP") >= 0 Then

                            strPortName = SerialPort1.PortName

                            TextBox1.Text = strTmp

                        End If

                    End If

                    SerialPort1.Close()

                Catch ex As Exception

                    If SerialPort1.IsOpen Then SerialPort1.Close()

                End Try

            Next

        End Sub

    End Class

     

     

    另外用ReadLine或是ReadExisting會讀不到東西,要實際去下Read或ReadByte的指令。

    2008年5月18日 上午 07:43
    版主
  • 謝謝大大提供程式,可是我執行完都沒有反應耶。

    我現在有個疑問是,我覺得我打開了port但是GPS感覺根本沒有開啟,是因為連外部的GPS時會自動連線然後開啟嗎?

    而我是內部的GPS要如何開啟阿?

     

    兩個port都可以開啟我也不知道為什麼耶,我的PDA裡面有一個選項是外部的GPS,點進去後有兩個地方可以設定port

    一個寫GPS程式連接埠,另外一個寫GPS硬體連接埠,我用papago連線時,連這兩個選項所選的port都收的到訊號。

     

    2008年5月19日 上午 10:23
  • 請問一下各位大大,誰有灌mobile 6 SDK

     

    因為我灌不起來,可以提供一下C:\Program Files\Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS

    在這路徑下的範例檔嗎?謝謝

    2008年5月19日 下午 03:31
  • 可以到這邊下載,http://bauann.myweb.hinet.net/GPS.rar

     

    2008年5月20日 上午 01:39
    版主
  •  pat-ab06c 寫信:

    謝謝大大提供程式,可是我執行完都沒有反應耶。

    我現在有個疑問是,我覺得我打開了port但是GPS感覺根本沒有開啟,是因為連外部的GPS時會自動連線然後開啟嗎?

    而我是內部的GPS要如何開啟阿?

     

    兩個port都可以開啟我也不知道為什麼耶,我的PDA裡面有一個選項是外部的GPS,點進去後有兩個地方可以設定port

    一個寫GPS程式連接埠,另外一個寫GPS硬體連接埠,我用papago連線時,連這兩個選項所選的port都收的到訊號。

     

     

    "外部GPS"是在WIndows Mobile 6上面的新東西,Jan Yeh 大哥也有做相關教學在MSDN教學短片,可以去看看;主要功能就是由這個"外部GPS"的應用程式來跟"實際"的硬體GPS連接,之後"外部GPS"這個應用軟體會模擬另一個com出來,其他所有需要存取GPS的程式都可以透過這個COM來連接;這個有設定之後要經過Reset,Reset完之後你去開"實際"GPS的COM就會開不起來了;這是字眼上面的關係,跟你想的有些不一樣。

    2008年5月20日 上午 01:48
    版主
  • 請問一下GPS座標值多久變更一次阿,如果是用走的它可以很明顯偵測到一兩公尺的差距嗎?

    就是我想要接收訊號然後搭配地圖用走的顯示我現在的位置,可以兩三秒就變更我現在的位置嗎,還是需要比較長的時間?

     

    2008年5月20日 上午 08:19
  • Hi,

    印象中GPS是1~2秒更新一次,不過這個跟你的硬體也會有關係,看硬體廠商那邊是怎麼做的;精度的部分可以google一下,滿多參考資料可以看的,就我所知GPS是一定會有誤差的,能不能差在1~2公尺之內這不是很確定(我覺得比較可能的誤差是在20公尺左右,不過也是印象,不確定)。

     

    2008年5月20日 上午 11:35
    版主
  • 我想問的是,一條路一直走,多久座標值會變更一次啊?會因為距離太近衛星偵測出來的位置會覺得差不多,所以直就沒變動嗎?

     

    2008年5月20日 下午 12:14
  • 我想請問我是直接開發PPC專案,不過我是直接灌在裝置上作測試,會不會是因為這樣所以我才無法開啟GPS和開啟port啊?

     

    2008年5月21日 下午 04:33
  • 程式可以正常執行嗎?看你是用哪一個版本的compact framework,裝置上面也要安裝。

     

    2008年5月22日 上午 02:12
    版主
  • 謝謝bauann的幫忙,我直接開啟serialPort還是失敗,最後我是使用mobile 6 SDK 所提供的範例檔,感覺沒使用到serialPort元件,但有成功接收值,謝謝你這麼熱心的回答,感恩感恩。

    2008年5月23日 下午 06:53