private bool AddFrameToMessageArray(CDllFifoMessages MessageFIFO) { try { CDllFifoMessages.MessageDll NewMessage = new CDllFifoMessages.MessageDll(); byte[] Frame1 = null; byte[] Frame2 = new byte[m_myFrameData[POS_LENGTH] - 1 + 1]; Frame1 = m_myFrameData.GetArray; Array.Copy(Frame1, POS_DATA, Frame2, 0, m_myFrameData[POS_LENGTH]); NewMessage.SourceDevice = System.Convert.ToByte(Frame1[POS_ORIGEN] & 0x7F); NewMessage.TargetDevice = System.Convert.ToByte(Frame1[POS_DESTINO] & 0x7F); if (m_FrameProtocol == CStationBase.Protocol.Protocol_01) { NewMessage.FID = (byte)0; } else if (m_FrameProtocol == CStationBase.Protocol.Protocol_02) { NewMessage.FID = Frame1[POS_FID]; } NewMessage.Command = Frame1[POS_CONTROL]; NewMessage.Datos = Frame2; NewMessage.Response = (Frame1[POS_ORIGEN] & 0x80) > 0; NewMessage.RawFrame = new byte[m_myFrameData.GetArray.Length - 1 + 1]; Array.Copy(m_myFrameData.GetArray, NewMessage.RawFrame, System.Convert.ToInt32(m_myFrameData.GetArray.Length)); MessageFIFO.PutMessage(NewMessage); return(true); } catch (Exception) { return(false); } }
internal void Eraser() { //Debug.Print("StackDll.Eraser") m_phl.Eraser(); m_phl = null; //m_phl.DataReceived += phl_DataReceived; //m_phl.ErrorConnect += phl_ErrorConnect; m_FrameFIFOOut.Reset(); m_FrameFIFOOut = null; m_MessageFIFOIn.Reset(); // #Edu# m_MessageFIFOIn = null; // #Edu# }
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 bool AddFrame(byte[] Data, byte sourceDevice, byte targetDevice, byte FrameControl, CDllFifoMessages FrameFIFO, byte FID = 0) { if (EncodeFrame(Data, sourceDevice, targetDevice, FrameControl, FID)) { CDllFifoMessages.MessageDll NewFrame = new CDllFifoMessages.MessageDll(); NewFrame.FID = FID; NewFrame.RawFrame = GetFrame(); NewFrame.RawStuffedFrame = GetStuffedFrame(); FrameFIFO.PutMessage(NewFrame); return(true); } else { return(false); } }