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); }
public void SetStatusIn(EnumEstadoIn Status) { // estado de recepción, si es buffer de recepción StatusIn = Status; }