Fix
This commit is contained in:
@@ -131,21 +131,28 @@ namespace Modbus.Net
|
|||||||
{
|
{
|
||||||
//ignore
|
//ignore
|
||||||
}
|
}
|
||||||
List<byte[]> duplicatedMessages;
|
List<(byte[], bool)> duplicatedMessages;
|
||||||
if (length == null || length == -1) return ans;
|
if (length == null || length == -1) return ans;
|
||||||
else if (length == 0) return null;
|
else if (length == 0) return null;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
duplicatedMessages = new List<byte[]>();
|
duplicatedMessages = new List<(byte[],bool)>();
|
||||||
|
var skipLength = 0;
|
||||||
while (receiveMessageCopy.Length >= length)
|
while (receiveMessageCopy.Length >= length)
|
||||||
{
|
{
|
||||||
var duplicateMessage = receiveMessageCopy.Take(length.Value).ToArray();
|
var duplicateMessage = receiveMessageCopy.Take(length.Value).ToArray();
|
||||||
if (CheckRightFunc != null && CheckRightFunc(duplicateMessage) == false)
|
if (CheckRightFunc != null && CheckRightFunc(duplicateMessage) == false)
|
||||||
{
|
{
|
||||||
receiveMessageCopy = receiveMessageCopy.TakeLast(receiveMessageCopy.Length - 1).ToArray();
|
receiveMessageCopy = receiveMessageCopy.TakeLast(receiveMessageCopy.Length - 1).ToArray();
|
||||||
|
skipLength++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
duplicatedMessages.Add(duplicateMessage);
|
if (skipLength > 0)
|
||||||
|
{
|
||||||
|
duplicatedMessages.Add((new byte[skipLength], false));
|
||||||
|
}
|
||||||
|
skipLength = 0;
|
||||||
|
duplicatedMessages.Add((duplicateMessage, true));
|
||||||
receiveMessageCopy = receiveMessageCopy.TakeLast(receiveMessageCopy.Length - length.Value).ToArray();
|
receiveMessageCopy = receiveMessageCopy.TakeLast(receiveMessageCopy.Length - length.Value).ToArray();
|
||||||
if (receiveMessageCopy.Length == 0) break;
|
if (receiveMessageCopy.Length == 0) break;
|
||||||
length = LengthCalc?.Invoke(receiveMessageCopy);
|
length = LengthCalc?.Invoke(receiveMessageCopy);
|
||||||
@@ -155,23 +162,30 @@ namespace Modbus.Net
|
|||||||
}
|
}
|
||||||
foreach (var message in duplicatedMessages)
|
foreach (var message in duplicatedMessages)
|
||||||
{
|
{
|
||||||
var def = GetMessageFromWaitingList(message);
|
if (!message.Item2)
|
||||||
if (def != null)
|
|
||||||
{
|
{
|
||||||
def.ReceiveMessage = receiveMessage;
|
ans.Add((message.Item1, true));
|
||||||
lock (WaitingMessages)
|
|
||||||
{
|
|
||||||
if (WaitingMessages.IndexOf(def) >= 0)
|
|
||||||
{
|
|
||||||
WaitingMessages.Remove(def);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
def.ReceiveMutex.Set();
|
|
||||||
ans.Add((message, true));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ans.Add((message, false));
|
var def = GetMessageFromWaitingList(message.Item1);
|
||||||
|
if (def != null)
|
||||||
|
{
|
||||||
|
def.ReceiveMessage = message.Item1;
|
||||||
|
lock (WaitingMessages)
|
||||||
|
{
|
||||||
|
if (WaitingMessages.IndexOf(def) >= 0)
|
||||||
|
{
|
||||||
|
WaitingMessages.Remove(def);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
def.ReceiveMutex.Set();
|
||||||
|
ans.Add((message.Item1, true));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ans.Add((message.Item1, false));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ans;
|
return ans;
|
||||||
|
|||||||
Reference in New Issue
Block a user