private void ParseReadoutReply(GXPacket packet, GXMBusCategory category)
		{
			List<byte> dataBuff = new List<byte>();
			dataBuff.Add((byte)packet.Bop);
			dataBuff.AddRange((byte[])packet.ExtractData(typeof(byte[]), 0, -1));
			dataBuff.Add((byte)packet.Checksum);
			dataBuff.Add((byte)packet.Eop);
			List<MBusRegister> registers = MBus.ParseReadReply(dataBuff.ToArray());
			for (int pos = 0; pos < registers.Count; ++pos)
			{
                foreach (GXMBusProperty it in category.Properties)
                {
                    if (it.Ordinal == pos)
                    {
                        it.SetValue(registers[pos].Value, false, PropertyStates.ValueChangedByDevice);
                        break;
                    }
                }				
			}
		}
		/// <summary>
		/// Create a copy of the GXPacket.
		/// </summary>
        public void Copy(GXPacket source)
        {
            Clear();
            lock (source.SyncRoot)
            {
                AppendData(source.ExtractData(typeof(byte[]), 0, -1));
                this.Bop = source.Bop;
                this.Eop = source.Eop;
                this.ChecksumSettings.Copy(source.ChecksumSettings);
				this.Sender = source.Sender;
            }
        }
		private bool IsReadoutComplete(object sender, GXPacket packet)
		{
			byte cField = (byte)packet.ExtractData(typeof(System.Byte), 3, 1);
			byte fcv = (byte) (cField & MASK_FCV);
			byte fcb = (byte) (cField & MASK_FCB);

			if (sender is GXMBusCategory)
			{
				ParseReadoutReply(packet, sender as GXMBusCategory);
			}
			else
			{
				//This should never happen
				throw new Exception("Unknown parameter \"sender\" in IsReadoutComplete.");
			}
			packet.Clear();
			if (fcv == 0)
			{
				return true;
			}
			else
			{
				m_PreviousFCB = fcb;
				return false;
			}
		}