예제 #1
0
        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);
        }
예제 #2
0
        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);
        }