/// <summary>
        /// Read data block from the device.
        /// </summary>
        /// <param name="data">data to send</param>
        /// <param name="text">Progress text.</param>
        /// <param name="multiplier"></param>
        /// <returns>Received data.</returns>
        internal byte[] ReadDataBlock(byte[] data, string text, double multiplier)
        {
            if (Parent.InactivityMode == InactivityMode.ReopenActive && Media is GXSerial && DateTime.Now.Subtract(ConnectionStartTime).TotalSeconds > 40)
            {
                Parent.Disconnect();
                Parent.InitializeConnection();
            }
            GXLogWriter.WriteLog(text, data);
            byte[]       reply    = ReadDLMSPacket(data);
            byte[]       allData  = null;
            RequestTypes moredata = m_Cosem.GetDataFromPacket(reply, ref allData);

            if (OnDataReceived != null)
            {
                OnDataReceived(this, (byte[])allData);
            }
            if ((moredata & (RequestTypes.Frame | RequestTypes.DataBlock)) != 0)
            {
                int maxProgress = m_Cosem.GetMaxProgressStatus(allData);
                NotifyProgress(text, 1, maxProgress);
                while (moredata != 0)
                {
                    while ((moredata & RequestTypes.Frame) != 0)
                    {
                        data = m_Cosem.ReceiverReady(RequestTypes.Frame);
                        GXLogWriter.WriteLog("Get next frame: ", (byte[])data);
                        reply = ReadDLMSPacket(data);
                        RequestTypes tmp = m_Cosem.GetDataFromPacket(reply, ref allData);
                        if (OnDataReceived != null)
                        {
                            OnDataReceived(this, (byte[])allData);
                        }
                        //If this was last frame.
                        if ((tmp & RequestTypes.Frame) == 0)
                        {
                            moredata &= ~RequestTypes.Frame;
                            break;
                        }
                        int current = m_Cosem.GetCurrentProgressStatus(allData);
                        //TODO: System.Diagnostics.Debug.Assert(!(current == maxProgress && moredata != RequestTypes.None));
                        NotifyProgress(text, (int)(multiplier * current), maxProgress);
                    }
                    if (Parent.InactivityMode == InactivityMode.ReopenActive && Media is GXSerial && DateTime.Now.Subtract(ConnectionStartTime).TotalSeconds > 40)
                    {
                        Parent.Disconnect();
                        Parent.InitializeConnection();
                    }
                    if ((moredata & RequestTypes.DataBlock) != 0)
                    {
                        //Send Receiver Ready.
                        data = m_Cosem.ReceiverReady(RequestTypes.DataBlock);
                        GXLogWriter.WriteLog("Get Next Data block: ", (byte[])data);
                        reply    = ReadDLMSPacket(data);
                        moredata = m_Cosem.GetDataFromPacket(reply, ref allData);
                        if (OnDataReceived != null)
                        {
                            OnDataReceived(this, (byte[])allData);
                        }
                        int current = m_Cosem.GetCurrentProgressStatus(allData);
                        //TODO: System.Diagnostics.Debug.Assert(!(current == maxProgress && moredata != RequestTypes.None));
                        NotifyProgress(text, (int)(multiplier * current), maxProgress);
                    }
                }
            }
            return(allData);
        }