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)); }
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)); }
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])); } }
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); } }
public override void Initialize(ReadOnlySpan <byte> frame) { base.Initialize(frame); StartAddress = (ushort)IPAddress.NetworkToHostOrder(NetCoreBitConverter.ToInt16(frame.Slice(2, 2))); }