|
|
@@ -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<byte> responseData = new List<byte>(); |
|
|
|
_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<byte> responseData = new List<byte>(); |
|
|
|
_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<byte> responseData = new List<byte>(); |
|
|
|
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<byte> responseData = new List<byte>(); |
|
|
|
_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(); |
|
|
|
|
|
|
|