Пример #1
0
        internal static ShortFrame CreateResetFrame()
        {
            var frame = new ShortFrame();

            frame.ControlField = 0x40;
            return(frame);
        }
Пример #2
0
        internal async Task <BaosFrame> SendResetFrame()
        {
            await WriteFrame(ShortFrame.CreateResetFrame());

            ControlValueIndicator = true;
            return(await ReadFrame());
        }
        private static int Serialize(ShortFrame frame, BinaryWriter writer)
        {
            writer.Write(frame.Start);
            writer.Write((byte)frame.Control);
            writer.Write(frame.Address);
            writer.Write(frame.Crc);
            writer.Write(frame.Stop);

            return(5);
        }
        public INetworkPacket Deserialize(BinaryReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            INetworkPacket packet = null;

            var start1 = reader.ReadByte();

            switch (start1)
            {
            case Constants.MBUS_FRAME_ACK_START:
            {
                packet = new AckFrame();
            }
            break;

            case Constants.MBUS_FRAME_SHORT_START:
            {
                //if (stream.Length != 5)
                //    return false;

                if (start1 != Constants.MBUS_FRAME_SHORT_START)
                {
                    return(packet);
                }

                var control = reader.ReadByte();
                var address = reader.ReadByte();
                var crc     = reader.ReadByte();

                if (crc != new byte[] { control, address }.CheckSum())
                {
                    return(packet);
                }

                var stop = reader.ReadByte();

                if (stop != Constants.MBUS_FRAME_STOP)
                {
                    return(packet);
                }

                packet = new ShortFrame(control, address);
            }
            break;

            case Constants.MBUS_FRAME_LONG_START:
            {
                const int MBUS_FRAME_FIXED_SIZE_LONG = 6;

                var length1 = reader.ReadByte();
                var length2 = reader.ReadByte();

                if (length1 < 3)
                {
                    return(packet);
                }

                if (length1 != length2)
                {
                    return(packet);
                }

                //if (stream.Length < length1 + MBUS_FRAME_FIXED_SIZE_LONG)
                //    return false;

                var start2 = reader.ReadByte();

                if (start2 != Constants.MBUS_FRAME_LONG_START)
                {
                    return(packet);
                }

                var control            = reader.ReadByte();
                var address            = reader.ReadByte();
                var controlInformation = reader.ReadByte();

                var data = reader.ReadBytes(length1 - 3);

                if (data.Length != length1 - 3)
                {
                    return(packet);
                }

                var crc  = reader.ReadByte();
                var stop = reader.ReadByte();

                if (crc != new byte[] { control, address, controlInformation }.Merge(data).CheckSum())
                {
                    return(packet);
                }

                if (length1 - 3 == 0)
                {
                    packet = new ControlFrame(control, controlInformation, address);
                }
                else if ((ControlInformation)controlInformation == ControlInformation.RESP_VARIABLE)
                {
                    packet = new VariableDataLongFrame(control, controlInformation, address, data, length1);
                }
                else if ((ControlInformation)controlInformation == ControlInformation.RESP_FIXED)
                {
                    packet = new FixedDataLongFrame(control, controlInformation, address, data, length1);
                }
                else
                {
                    throw new NotImplementedException();
                }
            }
            break;
            }

            return(packet);
        }