2013-11-28 48 views
0

我想通過使用C#中的GPS通過串行端口獲取GPS數據。我使用ParseNMEA類來獲取NMEA數據,解析它並獲得$ GPGAA。這是班級。如何通過C#中的串行端口讀取GPS數據?

public class ParseNMEA 
{ 
    private SerialPort _port; 
    private byte[] _buffer; 

    public string GetGpgga(string portname, int baudrate, Parity parity, int databits, StopBits stopbits) 
    { 
//Set serial-port 
     _port = new SerialPort(); 
     _port.PortName = portname; 
     _port.BaudRate = baudrate; 
     _port.Parity = parity; 
     _port.DataBits = databits; 
     _port.StopBits = stopbits; 
     _port.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived); 
     _port.Open(); 

//Parse buffer 
     string sdata = ""; 
     Encoding encoding = ASCIIEncoding.GetEncoding(1252); 
     if (null != _buffer) 
     { 
      sdata = encoding.GetString(_buffer); 
     } 
     string[] string_array = sdata.Split('$'); 
     string Gpgga = null; 
     for (int i = 0; i < string_array.Length; i++) 
     { 
      string stringTemp = string_array[i]; 
      string[] line_array = stringTemp.Split(','); 
      if (line_array[0] == "GPGGA") 
      { 
       Gpgga = string.Join(",", string_array[i]); 
      } 
     } 
     return Gpgga; 

    } 

    private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort port = (SerialPort)sender; 
     _buffer = new byte[port.BytesToRead]; 
     port.Read(_buffer, 0, _buffer.Length); 
    } 
} 

我想在窗體中調用這個類。像這樣:

private ParseNMEA _parse; 
_parse = new ParseNMEA(); 
private void button_start_click(object sender, EventArgs e) 
{ 
     string gpgga = _parse.GetGpgga(comport, baudrate, parity, databits, stopbits); 
     textBox1.Text = gpgga; 
} 

但這不起作用。我認爲SerialPort_DataReceived事件有任何問題。如果你有任何想法。請幫幫我。

謝謝。

回答

0

數據是從設備作爲字符串還是字節傳輸的?您正在讀取數據,好像它是以字節形式出現的,但是您將其轉換爲字符串值。如果以字符串形式出現,只需使用port.ReadLine()方法,但要確保將port.NewLine屬性設置爲與設備傳輸的任何換行符或字符串相對應。或者你可以使用port.ReadTo()方法並指定你正在查找的字符串。你是否收到任何數據?如果沒有找出你的設備需要什麼類型的握手,並設置port.Handshake屬性來匹配。

+0

感謝您的評論。我以字節的形式獲取數據。 – user3021107

0

GetGpgga()你不會出現等待要接收的數據 - 我期望更多的東西一樣(未經測試):

public class ParseNMEA 
{ 
    private SerialPort _port; 
    private byte[] _buffer; 

    public ParseNMEA() 
    { 
     //Set serial-port 
     _port = new SerialPort(); 
     _port.PortName = portname; 
     _port.BaudRate = baudrate; 
     _port.Parity = parity; 
     _port.DataBits = databits; 
     _port.StopBits = stopbits; 
     _port.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived); 
     _port.Open(); 
    } 

    public string LastGpgga { get; set; } 

    private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort port = (SerialPort)sender; 
     _buffer = new byte[port.BytesToRead]; 
     port.Read(_buffer, 0, _buffer.Length); 

     //Parse buffer 
     string sdata = ""; 
     Encoding encoding = ASCIIEncoding.GetEncoding(1252); 
     if (null != _buffer) 
     { 
      sdata = encoding.GetString(_buffer); 
     } 
     string[] string_array = sdata.Split('$'); 
     string Gpgga = null; 
     for (int i = 0; i < string_array.Length; i++) 
     { 
      string stringTemp = string_array[i]; 
      string[] line_array = stringTemp.Split(','); 
      if (line_array[0] == "GPGGA") 
      { 
       Gpgga = string.Join(",", string_array[i]); 
      } 
     } 
     this.LastGpgga = Gpgga; 
    } 
} 
+0

謝謝,但這不起作用。雖然我可以先得到_buffer並解析它,但我無法獲得下一個_buffer。 – user3021107

+0

不知道我從理論上講,代碼應該始終在屬性中包含最新的Gpgga - 所以屬性應該隨時間變化(嘗試在調試器中設置一個斷點,在「SerialPort_DataReceived」事件中,並且它應該被觸發定期) –

相關問題