2013-11-28 3 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); 
    } 
} 

Form에서이 클래스를 호출하고 싶습니다. 좋아요 :

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

고맙지 만 작동하지 않습니다. 첫 번째 버퍼를 가져 와서 구문 분석 할 수는 있지만 다음 버퍼를 가져올 수 없습니다. – user3021107

+0

이론에 따르면, 그 코드는 항상 그 속성에 가장 최근의 Gpgga를 가져야 만합니다 - 그래서 속성은 시간이 지남에 따라 변경되어야합니다 (디버거의 중단 점을'SerialPort_DataReceived' 이벤트에서 설정하려고 시도하면 충돌이 발생합니다 주기적으로) –

관련 문제