protected override void OnReadPacket()
        {
            // Read a sentence from the underlying stream
            NmeaSentence sentence = _Stream.ReadTypedSentence();

            // If we have a sentence, the device is NMEA!  Flag it if needed.
            if (Device != null && !Device.IsGpsDevice)
            {
                Device.SetIsGpsDevice(true);
            }

            /* The NmeaInterpreter in GPS.NET 3.0 uses a slimmed-down architecture to reduce
             * the memory and CPU footprint of processing NMEA data.
             */

            // All data updates in a single shot to prevent race conditions
            lock (DataChangeSyncRoot)
            {
                // Parse the sentence
                Parse(sentence);
            }

            // If we're recording, output the sentence
            lock (RecordingSyncRoot)
            {
                if (RecordingStream != null)
                {
                    byte[] buffer = ASCIIEncoding.ASCII.GetBytes(sentence.Sentence + "\r\n");
                    RecordingStream.Write(buffer, 0, buffer.Length);
                    OnSentenceRecorded(sentence);
                }
            }

            // Notify of the sentence
            OnSentenceReceived(sentence);
        }