private void Run() { try { string workingBuffer = string.Empty; while (true) { int bytesToRead = _port.BytesToRead; if (bytesToRead > 0) { byte[] buffer = new byte[bytesToRead]; _port.Read(buffer, 0, buffer.Length); string text = new string(Encoding.UTF8.GetChars(buffer)); workingBuffer += text.ToString(); int sentenceEndIndex; while ((sentenceEndIndex = workingBuffer.IndexOf(CrLf)) != -1) { string sentence = workingBuffer.Substring(0, sentenceEndIndex); if (sentence.IndexOf('$') != -1) { IGPSMessage message = GPSMessageParser.Parse(sentence); if (message != null) { if (message is FixedDataMessage) { GPSPosition position = ParsePosition(message as FixedDataMessage); if (PositionReceived != null) { PositionReceived(this, position); } } } } if (sentenceEndIndex + CrLf.Length == workingBuffer.Length) { workingBuffer = string.Empty; } else { workingBuffer = workingBuffer.Substring(sentenceEndIndex + CrLf.Length, workingBuffer.Length - sentenceEndIndex - CrLf.Length); } sentenceEndIndex = workingBuffer.IndexOf(CrLf); } Thread.Sleep(100); } } } catch (ThreadAbortException) { } }
private GPSPosition ParsePosition(FixedDataMessage message) { GPSPosition position = new GPSPosition(); position.HasFix = (message.PositionFix != PositionFixIndicator.Invalid); position.IsEstimate = (message.PositionFix == PositionFixIndicator.Estimated); if (position.HasFix) { position.Latitude = Convert.ToDouble(message.Latitude.Substring(0, 2)) + (Convert.ToDouble(message.Latitude.Substring(2, 7)) / 60); if (message.NSIndicator == 'S') position.Latitude = -position.Latitude; position.Longitude = Convert.ToDouble(message.Longitude.Substring(0, 3)) + (Convert.ToDouble(message.Longitude.Substring(3, 7)) / 60); if (message.EWIndicator == 'W') position.Longitude = -position.Longitude; } return position; }
private GPSPosition ParsePosition(FixedDataMessage message) { GPSPosition position = new GPSPosition(); position.HasFix = (message.PositionFix != PositionFixIndicator.Invalid); position.IsEstimate = (message.PositionFix == PositionFixIndicator.Estimated); if (position.HasFix) { position.Latitude = Convert.ToDouble(message.Latitude.Substring(0, 2)) + (Convert.ToDouble(message.Latitude.Substring(2, 7)) / 60); if (message.NSIndicator == 'S') { position.Latitude = -position.Latitude; } position.Longitude = Convert.ToDouble(message.Longitude.Substring(0, 3)) + (Convert.ToDouble(message.Longitude.Substring(3, 7)) / 60); if (message.EWIndicator == 'W') { position.Longitude = -position.Longitude; } } return(position); }