private bool ReceivePacket() { m_rcvState = RcvState.Idle; m_bufferSize = 0; int timeout = Environment.TickCount + m_readTimeout; while (Environment.TickCount < timeout) { int read = PortRead(m_tempBuffer, 0, m_tempBuffer.Length); if (read > 0) { if (ProcessData(m_tempBuffer, read)) { Logging.TraceHex(TraceEventType.Verbose, "Rt Pkt", m_buffer, 0, m_bufferSize); return(true); } } } Logging.Trace(TraceEventType.Warning, "Error reading packet from the bus."); return(false); }
private bool ProcessData(byte[] buffer, int length) { for (int i = 0; i < length; ++i) { byte ch = buffer[i]; switch (m_rcvState) { case RcvState.Idle: { switch (ch) { case (byte)ControlChars.DLE: m_rcvState = RcvState.DLE_START; break; case (byte)ControlChars.STX: m_rcvState = RcvState.Data; break; case (byte)ControlChars.NAK: case (byte)ControlChars.EOT: m_packetType = PacketType.Command; m_buffer[m_bufferSize++] = ch; m_rcvState = RcvState.Done; break; } } break; case RcvState.DLE_START: { switch (ch) { case (byte)ControlChars.STX: m_rcvState = RcvState.Data; m_packetType = PacketType.Data; break; case (byte)ControlChars.ACK0: case (byte)ControlChars.ACK1: m_buffer[m_bufferSize++] = ch; m_rcvState = RcvState.Done; m_packetType = PacketType.Command; break; } } break; case RcvState.DLE: { if (ch == (byte)ControlChars.DLE) { m_buffer[m_bufferSize++] = ch; m_rcvState = RcvState.Data; } else if (ch == (byte)ControlChars.ETX || ch == (byte)ControlChars.ETB) { m_buffer[m_bufferSize++] = ch; m_rcvState = RcvState.CHS_1; } } break; case RcvState.Data: { switch (ch) { case (byte)ControlChars.DLE: m_rcvState = RcvState.DLE; break; default: m_buffer[m_bufferSize++] = ch; break; } } break; case RcvState.CHS_1: m_buffer[m_bufferSize++] = ch; m_rcvState = RcvState.CHS_2; break; case RcvState.CHS_2: { m_buffer[m_bufferSize++] = ch; m_rcvState = RcvState.Done; } break; case RcvState.Done: break; } if (m_rcvState == RcvState.Done) { return(true); } } return(false); }