Example #1
0
        public int DecodeCheckReceivedData(byte[] Data, int targetDeviceToCheck, ref CDllFifoMessages MessageFIFO)
        {
            // rutina que analiza los datos recibidos y añade los mensajes a la lista MessageFIFO
            // el buffer se queda con lo que no ha podido generar mensaje y el estado de recepción (StatusIn)
            // devuelve la cantidad de errores producidos
            int iErrors = 0;

            foreach (byte value in Data)
            {
                switch (StatusIn)
                {
                case EnumEstadoIn.NoConnect:
                    break;

                case EnumEstadoIn.RxWaitingStartDLE:
                    if (value == DLE)
                    {
                        StatusIn = EnumEstadoIn.RxWaitingStartSTX;     //pasa a esperar el STX
                    }
                    break;

                case EnumEstadoIn.RxWaitingStartSTX:
                    if (value == STX)
                    {
                        StatusIn = EnumEstadoIn.RxReceivingFrame; //continúa recibiendo
                        m_myFrameData.Reset();                    // Borra lo anterior guardado
                        m_myFrameData.Add(value);                 //guarda dato
                    }
                    else if (value == DLE)
                    {
                        // continúa esperando un STX
                    }
                    else
                    {
                        StatusIn = EnumEstadoIn.RxWaitingStartDLE;     //Error empieza desde el principio
                    }
                    break;

                case EnumEstadoIn.RxReceivingFrame:
                    if (value != DLE)
                    {
                        m_myFrameData.Add(value);     //guarda y continúa recibiendo
                    }
                    else
                    {
                        StatusIn = EnumEstadoIn.RxReceivingFrameScapeDLE;     //Cambia de estado por si es una orden de bajo nivel
                    }
                    break;

                case EnumEstadoIn.RxReceivingFrameScapeDLE:
                    if (value == DLE)
                    {
                        StatusIn = EnumEstadoIn.RxReceivingFrame; //continúa recibiendo
                        m_myFrameData.Add(value);                 //guarda y continúa recibiendo
                    }
                    else if (value == ETX)
                    {
                        StatusIn = EnumEstadoIn.RxWaitingStartDLE;
                        m_myFrameData.Add(value);                    //guarda

                        if (CheckFrame(targetDeviceToCheck) == true) //Trama OK
                        {
                            AddFrameToMessageArray(MessageFIFO);
                        }
                        else
                        {
                            StatusIn = EnumEstadoIn.RxWaitingStartDLE;     //Error empieza desde el principio
                            iErrors++;
                        }
                        m_myFrameData.Reset();
                    }
                    else if (value == STX)                        // Inicio nueva trama
                    {
                        StatusIn = EnumEstadoIn.RxReceivingFrame; //continúa recibiendo
                        m_myFrameData.Reset();                    // Borra lo anterior guardado
                        m_myFrameData.Add(value);                 //guarda dato
                    }
                    else
                    {
                        StatusIn = EnumEstadoIn.RxWaitingStartDLE;     //Error empieza desde el principio
                        iErrors++;
                    }
                    break;

                default:
                    StatusIn = EnumEstadoIn.RxWaitingStartDLE;     //Error empieza desde el principio
                    iErrors++;
                    break;
                }
            }

            return(iErrors);
        }
Example #2
0
 public void SetStatusIn(EnumEstadoIn Status)
 {
     // estado de recepción, si es buffer de recepción
     StatusIn = Status;
 }