public CCommunicationManager(String portName)
        {
            mRxMessageBuffer = new BlockingCollection<CProtocolMessage>();

              mPortName = portName;

              mReadingState = EReadingState.WaitingFor_StartChar;
              mCharToRead = 0;
              mReceiveBuffer = new Queue<byte>();
        }
        private void ReceiveFromPIC(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
              int bufferLength = sp.BytesToRead;
              byte[] buffer = new byte[bufferLength];
              sp.Read(buffer, 0, bufferLength);

              Debug.WriteLine("ReceiveFromPic, data=" + string.Join(",", buffer));

              int i;
              for (i = 0; i < bufferLength; i++)
              {
            byte currChar = buffer[i];

            switch (mReadingState)
            {
              case EReadingState.WaitingFor_StartChar:
            {
              if (currChar == START_CHAR)
              {
                mReadingState = EReadingState.WaitingFor_PacketID;
                mReceiveBuffer = new Queue<byte>();
              }
              else
                Logging.Log.LogError("Invalid start char: " + currChar);
            }
            break;
              case EReadingState.WaitingFor_PacketID:
            {
              mRxPacketId = currChar;
              mReadingState = EReadingState.WaitingFor_Length;
            }
            break;
              case EReadingState.WaitingFor_Length:
            {
              mCharToRead = currChar;
              mReadingState = EReadingState.Reading_Data;
            }
            break;
              case EReadingState.Reading_Data:
            {
              mCharToRead--;
              mReceiveBuffer.Enqueue(buffer[i]);
              if (mCharToRead == 0)
              {
                mReadingState = EReadingState.WaitingFor_CheckSum;
              }
            }
            break;
              case EReadingState.WaitingFor_CheckSum:
            {
              mRxChecksum = currChar;
              mReadingState = EReadingState.WaitingFor_EndChar;
            }
            break;
              case EReadingState.WaitingFor_EndChar:
            {
              mReadingState = EReadingState.WaitingFor_StartChar;
              if (currChar == END_CHAR)
              {
                mRxMessageBuffer.Add(new CProtocolMessage(mRxPacketId, (ECommands)mReceiveBuffer.ElementAt(0), mReceiveBuffer.Skip(1).ToList()));
              }
              else
                Logging.Log.LogError("Invalid RX End char: " + currChar);
            }
            break;
            }
              }
        }