Esempio n. 1
0
        protected override async Task <IModbusResponse> ReadResponseAsync <TResponse>(CancellationToken token = default)
        {
            var buffer = await PipeResource.ReadAsync(token).ConfigureAwait(false);

            while (buffer.Length < MbapHeaderSizeOnResponse)
            {
                PipeResource.AdvanceTo(buffer.Start);
                buffer = await PipeResource.ReadAsync(token).ConfigureAwait(false);
            }

            var frameLength = (ushort)IPAddress.HostToNetworkOrder(NetCoreBitConverter.ToInt16(buffer.Slice(4, 2).ToSpan()));

            while (buffer.Length < MbapHeaderSizeOnResponse + frameLength)
            {
                PipeResource.AdvanceTo(buffer.Start);
                buffer = await PipeResource.ReadAsync(token).ConfigureAwait(false);
            }

            var processedSequence = buffer.Slice(0, MbapHeaderSizeOnResponse + frameLength);

            var response = ModbusResponseFactory.CreateResponse <TResponse>(
                processedSequence.Slice(MbapHeaderSizeOnResponse, processedSequence.Length - MbapHeaderSizeOnResponse).ToSpan());

            response.TransactionId = (ushort)IPAddress.NetworkToHostOrder(NetCoreBitConverter.ToInt16(buffer.Slice(0, 2).ToSpan()));

            PipeResource.AdvanceTo(processedSequence.End);

            return(response);
        }
        public void NetCoreBitConverterToInt16ReturnsFalseOnInvalidSpanSize()
        {
            // Arrange
            var array = new byte[1];

            // Act/Assert
            Assert.False(NetCoreBitConverter.TryWriteBytes(array, short.MaxValue));
        }
        public void NetCoreBitConverterToInt16ThrowsOnInvalidSpanSize()
        {
            // Arrange
            var array = new byte[1];

            // Act/Assert
            Assert.Throws <ArgumentOutOfRangeException>("value", () => NetCoreBitConverter.ToInt16(array));
        }
Esempio n. 4
0
        public override void WriteTo(Memory <byte> buffer)
        {
            base.WriteTo(buffer);

            var bufferSpan = buffer.Span;

            NetCoreBitConverter.TryWriteBytes(bufferSpan.Slice(1, 2), IPAddress.HostToNetworkOrder((short)StartAddress));
            NetCoreBitConverter.TryWriteBytes(bufferSpan.Slice(3, 2), IPAddress.HostToNetworkOrder((short)Value));
        }
Esempio n. 5
0
        public override void WriteTo(Memory <byte> buffer)
        {
            base.WriteTo(buffer);

            var bufferSpan = buffer.Span;

            NetCoreBitConverter.TryWriteBytes(bufferSpan.Slice(1, 2), IPAddress.HostToNetworkOrder((short)StartAddress));
            NetCoreBitConverter.TryWriteBytes(bufferSpan.Slice(3, 2), IPAddress.HostToNetworkOrder((short)NumberOfPoints));
            bufferSpan[5] = (byte)(ByteSize - 6);
        }
        public override void WriteTo(Memory <byte> buffer)
        {
            base.WriteTo(buffer);

            var bufferSpan = buffer.Span;

            for (int i = 0; i < data.Length; i++)
            {
                NetCoreBitConverter.TryWriteBytes(bufferSpan.Slice((i * 2) + 6, 2), IPAddress.HostToNetworkOrder((short)data[i]));
            }
        }
Esempio n. 7
0
        protected override async Task WriteRequestAsync(IModbusRequest request, CancellationToken token = default)
        {
            using (var memoryOwner = MemoryPool <byte> .Shared.Rent(MbapHeaderSizeOnRequest + request.ByteSize))
            {
                var memory = memoryOwner.Memory;

                NetCoreBitConverter.TryWriteBytes(memory.Slice(0, 2).Span, IPAddress.HostToNetworkOrder((short)request.TransactionId));
                memory.Span[2] = 0;
                memory.Span[3] = 0;
                NetCoreBitConverter.TryWriteBytes(memory.Slice(4, 2).Span, IPAddress.HostToNetworkOrder((short)(request.ByteSize + 1)));
                memory.Span[6] = request.SlaveAddress;

                request.WriteTo(memory.Slice(MbapHeaderSizeOnRequest, request.ByteSize));

                await PipeResource.WriteAsync(memory.Slice(0, MbapHeaderSizeOnRequest + request.ByteSize), token).ConfigureAwait(false);
            }
        }
Esempio n. 8
0
        public override void Initialize(ReadOnlySpan <byte> frame)
        {
            base.Initialize(frame);

            StartAddress = (ushort)IPAddress.NetworkToHostOrder(NetCoreBitConverter.ToInt16(frame.Slice(2, 2)));
        }