/// <summary>
        /// This function gets message from the remote unit.
        /// </summary>
        /// <param name="Rxmsg">Received message</param>
        /// <param name="Txmsg">Transmited message, information about this frmae could be necessary to properly init received frame.
        /// </param>
        /// <returns>
        ///   ALRes_Success: Operation accomplished successfully
        ///   ALRes_DatTransferErrr: Data transfer is imposible because of a communication error – loss of
        ///      communication with a station
        ///   ALRes_DisInd: Disconnect indication – connection has been shut down remotely or lost because of
        ///      communication error. Data is unavailable
        /// </returns>
        protected override AL_ReadData_Result GetMessage(out ModBusMessage Rxmsg, ModBusMessage Txmsg)
        {
            Rxmsg = null;
            try
            {
                InterCharStopwatch.Reset();
                InterCharStopwatch.Start();
                if (!CheckCharTimeout(GetProtocolParameters.ResponseTimeOutSpan, InterCharStopwatch))
                {
                    GetIProtocolParent.IncStRxNoResponseCounter();
                    return(AL_ReadData_Result.ALRes_DatTransferErrr);
                }
                GetIProtocolParent.TimeMaxResponseDelayAdd(InterCharStopwatch.ElapsedMilliseconds);
                Rxmsg = m_Pool.GetEmptyISesDBuffer();
                Rxmsg.userDataLength = Rxmsg.userBuffLength;
                Rxmsg.offset         = 0;
                bool first = true;
                do
                {
                    byte lastChar;
                    InterCharStopwatch.Reset();
                    InterCharStopwatch.Start();
                    switch (GetICommunicationLayer.GetChar(out lastChar))
                    {
                    case TGetCharRes.Success:
                        if (!Rxmsg.WriteByte(lastChar))
                        {
                            return(AL_ReadData_Result.ALRes_DatTransferErrr);
                        }
                        if (first)
                        {
                            first = false;
                        }
                        else
                        {
                            GetIProtocolParent.TimeCharGapAdd(CAS.Lib.RTLib.Processes.Timer.ToUSeconds(InterCharStopwatch.Elapsed));
                        }
                        break;

                    case TGetCharRes.DisInd:
                        return(AL_ReadData_Result.ALRes_DisInd);
                    }
                }while (CheckCharTimeout(((ModBus_ProtocolParameters)GetProtocolParameters).TimeoutCharacterSpan, InterCharStopwatch));
                Rxmsg.userDataLength = Rxmsg.offset;
                Rxmsg.offset         = 0;
                if (CheckCharTimeout(((ModBus_ProtocolParameters)GetProtocolParameters).TimeoutCharacterSpan, InterCharStopwatch))
                {
                    Flush(((ModBus_ProtocolParameters)GetProtocolParameters).InterframeGapSpan);
                    Rxmsg.ReturnEmptyEnvelope();
                    Rxmsg = null;
                    GetIProtocolParent.IncStRxFragmentedCounter();
                    return(AL_ReadData_Result.ALRes_DatTransferErrr);
                }
                return(AL_ReadData_Result.ALRes_Success);
            }
            catch (DisconnectException) { return(AL_ReadData_Result.ALRes_DisInd); }
        }
        /// <summary>
        /// This function gets message from the remote unit.
        /// </summary>
        /// <param name="receiveMessage">Received message</param>
        /// <param name="transmitMessage">Transited message, information about this frame could be necessary to properly initialize received frame.
        /// </param>
        /// <returns>
        ///   ALRes_Success: Operation accomplished successfully
        ///   ALRes_DatTransferErrr: Data transfer is imposable because of a communication error – loss of
        ///      communication with a station
        ///   ALRes_DisInd: Disconnect indication – connection has been shut down remotely or lost because of
        ///      communication error. Data is unavailable
        /// </returns>
        protected override AL_ReadData_Result GetMessage(out ModBusMessage receiveMessage, ModBusMessage transmitMessage)
        {
            receiveMessage = null;
            try
            {
                InterCharStopwatch.Reset();
                InterCharStopwatch.Start();
                if (!CheckCharTimeout(GetProtocolParameters.ResponseTimeOutSpan, InterCharStopwatch))
                {
                    GetIProtocolParent.IncStRxNoResponseCounter();
                    return(AL_ReadData_Result.ALRes_DatTransferErrr);
                }
                GetIProtocolParent.TimeMaxResponseDelayAdd(InterCharStopwatch.ElapsedMilliseconds);
                receiveMessage = m_Pool.GetEmptyISesDBuffer();
                receiveMessage.userDataLength = receiveMessage.userBuffLength;
                receiveMessage.offset         = 0;
                bool first = true;
                do
                {
                    byte lastChar;
                    InterCharStopwatch.Reset();
                    InterCharStopwatch.Start();
                    switch (GetICommunicationLayer.GetChar(out lastChar))
                    {
                    case TGetCharRes.Success:
                        if (!receiveMessage.WriteByte(lastChar))
                        {
                            AssemblyTraceEvent.Tracer.TraceEvent(TraceEventType.Warning, 77, "ModBusProtocol.GetMessage: cannot write character received from the Communication Layer");
                            return(AL_ReadData_Result.ALRes_DatTransferErrr);
                        }
                        if (first)
                        {
                            first = false;
                        }
                        else
                        {
                            GetIProtocolParent.TimeCharGapAdd(CAS.Lib.RTLib.Processes.Timer.ToUSeconds(InterCharStopwatch.Elapsed));
                        }
                        break;

                    case TGetCharRes.DisInd:
                        return(AL_ReadData_Result.ALRes_DisInd);
                    }
                }while (CheckCharTimeout(((ModBus_ProtocolParameters)GetProtocolParameters).Timeout15Span, InterCharStopwatch));
                receiveMessage.userDataLength = receiveMessage.offset;
                receiveMessage.offset         = 0;
                if (CheckCharTimeout(((ModBus_ProtocolParameters)GetProtocolParameters).Timeout35Span, InterCharStopwatch))
                {
                    Flush(((ModBus_ProtocolParameters)GetProtocolParameters).Timeout35Span);
                    receiveMessage.ReturnEmptyEnvelope();
                    receiveMessage = null;
                    GetIProtocolParent.IncStRxFragmentedCounter();
                    return(AL_ReadData_Result.ALRes_DatTransferErrr);
                }
                return(AL_ReadData_Result.ALRes_Success);
            }
            catch (DisconnectException)
            {
                return(AL_ReadData_Result.ALRes_DisInd);
            }
        }