This commit is contained in:
luosheng
2023-07-15 07:37:06 +08:00
parent ec70edc20b
commit f8f3e1e6b0

View File

@@ -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;