diff --git a/Modbus.Net/Modbus.Net/Connector/BaseConnector.cs b/Modbus.Net/Modbus.Net/Connector/BaseConnector.cs
index 8375bd4..9cb4dfb 100644
--- a/Modbus.Net/Modbus.Net/Connector/BaseConnector.cs
+++ b/Modbus.Net/Modbus.Net/Connector/BaseConnector.cs
@@ -49,8 +49,9 @@ namespace Modbus.Net
/// 发送内部
///
/// 发送的信息
+ /// 是否为重发消息
/// 发送信息的定义
- protected async Task SendMsgInner(byte[] message)
+ protected async Task SendMsgInner(byte[] message, bool repeat = false)
{
IDisposable asyncLock = null;
try
@@ -73,6 +74,10 @@ namespace Modbus.Net
success = messageSendingdef.ReceiveMutex.WaitOne(TimeoutTime);
if (success)
{
+ if (!repeat && messageSendingdef.ReceiveMessage == null)
+ {
+ return await SendMsgInner(message, true);
+ }
return messageSendingdef;
}
}
diff --git a/Modbus.Net/Modbus.Net/Controller/BaseController.cs b/Modbus.Net/Modbus.Net/Controller/BaseController.cs
index f1638f6..4fabf3d 100644
--- a/Modbus.Net/Modbus.Net/Controller/BaseController.cs
+++ b/Modbus.Net/Modbus.Net/Controller/BaseController.cs
@@ -159,6 +159,25 @@ namespace Modbus.Net
if (length == -1) break;
if (length == 0) return null;
}
+ if (skipLength > 0)
+ {
+ lock (WaitingMessages)
+ {
+ var def = GetMessageFromWaitingList(null);
+ if (def != null)
+ {
+ lock (WaitingMessages)
+ {
+ if (WaitingMessages.IndexOf(def) >= 0)
+ {
+ WaitingMessages.Remove(def);
+ }
+ }
+ def.ReceiveMutex.Set();
+ }
+ }
+ return null;
+ }
}
foreach (var message in duplicatedMessages)
{
diff --git a/Modbus.Net/Modbus.Net/Controller/FifoController.cs b/Modbus.Net/Modbus.Net/Controller/FifoController.cs
index 2ca46dc..81a91e2 100644
--- a/Modbus.Net/Modbus.Net/Controller/FifoController.cs
+++ b/Modbus.Net/Modbus.Net/Controller/FifoController.cs
@@ -16,12 +16,8 @@ namespace Modbus.Net
private bool _taskCancel = false;
- private bool _activateSema = false;
-
private int _waitingListMaxCount;
- private Semaphore _taskCycleSema;
-
///
/// 间隔时间
///
@@ -31,33 +27,25 @@ namespace Modbus.Net
/// 构造器
///
/// 间隔时间
- /// 是否开启信号量
/// 包切分长度函数
/// 包校验函数
/// 包等待队列长度
- public FifoController(int acquireTime, bool activateSema = true, Func lengthCalc = null, Func checkRightFunc = null, int? waitingListMaxCount = null)
+ public FifoController(int acquireTime, Func lengthCalc = null, Func checkRightFunc = null, int? waitingListMaxCount = null)
: base(lengthCalc, checkRightFunc)
{
_waitingListMaxCount = int.Parse(waitingListMaxCount != null ? waitingListMaxCount.ToString() : null ?? ConfigurationReader.GetValueDirect("Controller", "WaitingListCount"));
- _activateSema = activateSema;
- if (_activateSema)
- {
- _taskCycleSema = new Semaphore(0, _waitingListMaxCount);
- }
AcquireTime = acquireTime;
}
///
protected override void SendingMessageControlInner()
{
- _taskCycleSema?.WaitOne();
while (!_taskCancel)
{
if (AcquireTime > 0)
{
Thread.Sleep(AcquireTime);
}
- bool sendSuccess = false;
lock (WaitingMessages)
{
try
@@ -68,7 +56,6 @@ namespace Modbus.Net
{
_currentSendingPos = WaitingMessages.First();
_currentSendingPos.SendMutex.Set();
- sendSuccess = true;
}
}
else
@@ -76,13 +63,11 @@ namespace Modbus.Net
if (WaitingMessages.Count <= 0)
{
_currentSendingPos = null;
- sendSuccess = true;
}
else if (WaitingMessages.IndexOf(_currentSendingPos) == -1)
{
_currentSendingPos = WaitingMessages.First();
_currentSendingPos.SendMutex.Set();
- sendSuccess = true;
}
}
}
@@ -90,7 +75,6 @@ namespace Modbus.Net
{
logger.LogError(e, "Controller _currentSendingPos disposed");
_currentSendingPos = null;
- sendSuccess = true;
}
catch (Exception e)
{
@@ -98,23 +82,13 @@ namespace Modbus.Net
_taskCancel = true;
}
}
- if (sendSuccess)
- {
- _taskCycleSema?.WaitOne();
- }
}
- _taskCycleSema.Dispose();
- _taskCycleSema = null;
Clear();
}
///
public override void SendStart()
{
- if (_taskCycleSema == null && _activateSema)
- {
- _taskCycleSema = new Semaphore(0, _waitingListMaxCount);
- }
_taskCancel = false;
base.SendStart();
}
@@ -154,10 +128,6 @@ namespace Modbus.Net
return false;
}
var success = base.AddMessageToList(def);
- if (success)
- {
- _taskCycleSema?.Release();
- }
return success;
}
}
diff --git a/Modbus.Net/Modbus.Net/Controller/MatchController.cs b/Modbus.Net/Modbus.Net/Controller/MatchController.cs
index 65153af..fca2d21 100644
--- a/Modbus.Net/Modbus.Net/Controller/MatchController.cs
+++ b/Modbus.Net/Modbus.Net/Controller/MatchController.cs
@@ -19,12 +19,11 @@ namespace Modbus.Net
///
/// 匹配字典,每个Collection代表一个匹配集合,每一个匹配集合中的数字代表需要匹配的位置,最后计算出来的数字是所有位置数字按照集合排序后叠放在一起
/// 获取间隔
- /// 是否开启信号量
/// 包长度计算
/// 包校验函数
/// 包等待队列长度
- public MatchController(ICollection<(int, int)>[] keyMatches, int acquireTime, bool activateSema = true,
- Func lengthCalc = null, Func checkRightFunc = null, int? waitingListMaxCount = null) : base(acquireTime, activateSema, lengthCalc, checkRightFunc, waitingListMaxCount)
+ public MatchController(ICollection<(int, int)>[] keyMatches, int acquireTime,
+ Func lengthCalc = null, Func checkRightFunc = null, int? waitingListMaxCount = null) : base(acquireTime, lengthCalc, checkRightFunc, waitingListMaxCount)
{
KeyMatches = keyMatches;
}
@@ -52,6 +51,7 @@ namespace Modbus.Net
///
protected override MessageWaitingDef GetMessageFromWaitingList(byte[] receiveMessage)
{
+ if (receiveMessage == null) return null;
var returnKey = GetKeyFromMessage(receiveMessage);
MessageWaitingDef ans;
lock (WaitingMessages)
diff --git a/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs b/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs
index 796333a..b6e1627 100644
--- a/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs
+++ b/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs
@@ -16,7 +16,7 @@ namespace Modbus.Net
///
public MatchDirectlySendController(ICollection<(int, int)>[] keyMatches,
Func lengthCalc = null, Func checkRightFunc = null, int? waitingListMaxCount = null) : base(keyMatches,
- 0, false, lengthCalc, checkRightFunc, waitingListMaxCount)
+ 0, lengthCalc, checkRightFunc, waitingListMaxCount)
{
}