diff --git a/ModbusDemo/Device/ModbusRTU.cs b/ModbusDemo/Device/ModbusRTU.cs index f578025..5152131 100644 --- a/ModbusDemo/Device/ModbusRTU.cs +++ b/ModbusDemo/Device/ModbusRTU.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; using System.Windows; @@ -56,17 +57,28 @@ namespace ModbusDemo.Device byte[] sendByte = sendByteList.ToArray(); int maxRetries = 3; // 最大重试次数 int attempt = 0; - + byte[] response = null; + List responseData = new List(); + _serialPort.Write(sendByte, 0, sendByte.Length); while (attempt < maxRetries) { try { - // 清空接收缓冲区(避免残留数据干扰) - _serialPort.DiscardInBuffer(); - _serialPort.Write(sendByte, 0, sendByte.Length); - Thread.Sleep(300); - byte[] response = new byte[_serialPort.BytesToRead]; - _serialPort.Read(response, 0, _serialPort.BytesToRead); + //使用时间去轮询查询数据 + DateTime startTime = DateTime.Now; + while ((DateTime.Now - startTime).TotalMilliseconds < _serialPort.ReadTimeout) + { + int bytesToRead = _serialPort.BytesToRead; + if (bytesToRead > 0) + { + byte[] buffer = new byte[bytesToRead]; + int bytesRead = _serialPort.Read(buffer, 0, bytesToRead); + responseData.AddRange(buffer.Take(bytesRead)); + } + //延迟20毫秒,节约cpu资源 + Task.Delay(20); + } + response = responseData.ToArray(); if (response[0] == 0x00) { continue; @@ -203,16 +215,27 @@ namespace ModbusDemo.Device int maxRetries = 3; // 最大重试次数 int attempt = 0; byte[] response = null; + List responseData = new List(); + _serialPort.Write(sendByte, 0, sendByte.Length); while (attempt < maxRetries) { try { - // 清空接收缓冲区(避免残留数据干扰) - _serialPort.DiscardInBuffer(); - _serialPort.Write(sendByte, 0, sendByte.Length); - Thread.Sleep(300); - response = new byte[_serialPort.BytesToRead]; - _serialPort.Read(response, 0, _serialPort.BytesToRead); + //使用时间去轮询查询数据 + DateTime startTime = DateTime.Now; + while ((DateTime.Now - startTime).TotalMilliseconds < _serialPort.ReadTimeout) + { + int bytesToRead = _serialPort.BytesToRead; + if (bytesToRead > 0) + { + byte[] buffer = new byte[bytesToRead]; + int bytesRead = _serialPort.Read(buffer, 0, bytesToRead); + responseData.AddRange(buffer.Take(bytesRead)); + } + //延迟20毫秒,节约cpu资源 + Task.Delay(20); + } + response = responseData.ToArray(); if (response[0] != 0x00) { break; @@ -271,17 +294,29 @@ namespace ModbusDemo.Device byte[] sendByte = sendByteList.ToArray(); int maxRetries = 3; // 最大重试次数 int attempt = 0; + List responseData = new List(); + byte[] response = null; + _serialPort.Write(sendByte, 0, sendByte.Length); while (attempt < maxRetries) { try { - // 清空接收缓冲区(避免残留数据干扰) - _serialPort.DiscardInBuffer(); - _serialPort.Write(sendByte, 0, sendByte.Length); - Thread.Sleep(300); - byte[] response = new byte[_serialPort.BytesToRead]; - _serialPort.Read(response, 0, _serialPort.BytesToRead); + //使用时间去轮询查询数据 + DateTime startTime = DateTime.Now; + while ((DateTime.Now - startTime).TotalMilliseconds < _serialPort.ReadTimeout) + { + int bytesToRead = _serialPort.BytesToRead; + if (bytesToRead > 0) + { + byte[] buffer = new byte[bytesToRead]; + int bytesRead = _serialPort.Read(buffer, 0, bytesToRead); + responseData.AddRange(buffer.Take(bytesRead)); + } + //延迟20毫秒,节约cpu资源 + Task.Delay(20); + } + response = responseData.ToArray(); if (response[0] == 0x00) { continue; @@ -388,18 +423,27 @@ namespace ModbusDemo.Device int maxRetries = 3; // 最大重试次数 int attempt = 0; byte[] response = null; - - while (attempt< maxRetries) + List responseData = new List(); + _serialPort.Write(sendByte, 0, sendByte.Length); + while (attempt < maxRetries) { try { - // 清空接收缓冲区(避免残留数据干扰) - _serialPort.DiscardInBuffer(); - - _serialPort.Write(sendByte, 0, sendByte.Length); - Thread.Sleep(1000); - response = new byte[_serialPort.BytesToRead]; - _serialPort.Read(response, 0, _serialPort.BytesToRead); + //使用时间去轮询查询数据 + DateTime startTime = DateTime.Now; + while ((DateTime.Now - startTime).TotalMilliseconds < _serialPort.ReadTimeout) + { + int bytesToRead = _serialPort.BytesToRead; + if (bytesToRead > 0) + { + byte[] buffer = new byte[bytesToRead]; + int bytesRead = _serialPort.Read(buffer, 0, bytesToRead); + responseData.AddRange(buffer.Take(bytesRead)); + } + //延迟20毫秒,节约cpu资源 + Task.Delay(20); + } + response = responseData.ToArray(); if (response[0] != 0x00) { break; @@ -410,14 +454,14 @@ namespace ModbusDemo.Device attempt++; } } - + //将操作的指令,插入数据库 string RequestStr = ByteArrayToString(sendByte); string responseStr = ByteArrayToString(response); ModbusLog m = new ModbusLog(); m.OperationType = "写寄存器"; m.ResponseData = responseStr; - m.RequestData = responseStr; + m.RequestData = RequestStr; _modbusDbContext.Add(m); _modbusDbContext.SaveChanges(); diff --git a/ModbusDemo/VIew/SettingsUC.xaml b/ModbusDemo/VIew/SettingsUC.xaml index 6e02848..91bdfbb 100644 --- a/ModbusDemo/VIew/SettingsUC.xaml +++ b/ModbusDemo/VIew/SettingsUC.xaml @@ -31,7 +31,7 @@ - + @@ -72,7 +72,7 @@ Height="30" Margin="10,0,0,5" HorizontalAlignment="Left" - materialDesign:HintAssist.Hint="19200" + materialDesign:HintAssist.Hint="9600" SelectedItem="{Binding BaudRate}"> @@ -139,18 +139,18 @@