示例#1
0
 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);
     }
 }
示例#2
0
 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#
 }
示例#3
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);
        }
示例#4
0
 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);
     }
 }