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; } } }