private void StartGPS() { try { Logging.LogMethodCall(MethodBase.GetCurrentMethod().DeclaringType.Name); _stop = false; if (_isUdp) { using (_udpPort = new UdpClient(int.Parse(_port))) { var endPoint = new IPEndPoint(IPAddress.IPv6Any, 0); while (!_stop) { try { byte[] bytes = _udpPort.Receive(ref endPoint); HandleMessage(bytes, bytes.Length); } catch (Exception ex) { GPSMessageRecieved?.Invoke(this, new GPSMessageRecievedEventArgs(ex, false)); } } } } else { using (_serialPort = new SerialPort(_port, _baudRate))//, Parity.None, 8, StopBits.One { _serialPort.Open(); byte[] read = new byte[_serialPort.ReadBufferSize]; int bytesRead = 0; while (!_stop && _serialPort.IsOpen) { try { if ((bytesRead = _serialPort.Read(read, 0, read.Length)) > 0) { HandleMessage(read, bytesRead); } } catch (Exception ex) { GPSMessageRecieved?.Invoke(this, new GPSMessageRecievedEventArgs(ex, false)); } } } } } catch (Exception ex) { GPSMessageRecieved?.Invoke(this, new GPSMessageRecievedEventArgs(ex, true)); } }
private void HandleMessage(byte[] read, int bytesRead) { Logging.LogMethodCall(MethodBase.GetCurrentMethod().DeclaringType.Name, () => new Dictionary <String, Object> { { nameof(read), read }, { nameof(bytesRead), bytesRead } }); string message = Encoding.ASCII.GetString(read, 0, bytesRead); Logging.LogMessage(Logging.LogType.Info, "GPS Message Recieved - " + message); if (_gpsMessageBuilder == null) { _gpsMessageBuilder = new StringBuilder(); } _gpsMessageBuilder.Append(message); int remove = -1; for (int i = 0; i < _gpsMessageBuilder.Length; i++) { if (GPS_MESSAGE_SPLITTERS.Contains(_gpsMessageBuilder[i])) { Point ret = null; String msg = null; if (remove >= 0) { msg = _gpsMessageBuilder.ToString(remove, i - remove + 1); } else { msg = _gpsMessageBuilder.ToString(0, i + 1); } ret = DecodeMessage(msg); if (ret != null) { GPSMessageRecieved?.Invoke(this, new GPSMessageRecievedEventArgs(ret.Latitude, ret.Longitude, msg)); } remove = i; } } if (remove >= 0) { _gpsMessageBuilder.Remove(0, remove + 1); } }