using System.Diagnostics;
using System.IO.Ports;
using System.Windows;
using NModbus;
using NModbus.Serial;
namespace WPF_2_NModbus.NModBus;
public class SerialPortAsync : IDisposable
{
private readonly string _portName;
private readonly IModbusSerialMaster _serialMaster;
private bool _disposed;
public SerialPortAsync(string portName)
{
if (string.IsNullOrWhiteSpace(portName))
throw new ArgumentException("端口名称不能为空", nameof(portName));
_portName = portName;
_serialMaster = CreateModbusSerialMaster();
}
public void Dispose()
{
if (_disposed) return;
_serialMaster.Dispose();
_disposed = true;
GC.SuppressFinalize(this);
}
///
/// 异步写入寄存器
///
/// 从站ID
/// 起始地址
/// 要写入的寄存器值
/// 取消令牌
/// 表示异步操作的任务
public async Task WriteRegistersAsync(byte slaveId, ushort startAddress, ushort[] registers,
CancellationToken cancellationToken = default)
{
if (!_disposed)
try
{
await Task.Run(() =>
{
cancellationToken.ThrowIfCancellationRequested();
_serialMaster.WriteMultipleRegisters(slaveId, startAddress, registers);
}, cancellationToken).ConfigureAwait(false);
}
catch (Exception ex)
{
Console.WriteLine(ex);
Debug.WriteLine(ex);
MessageBox.Show("写入寄存器失败", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
///
/// 创建Modbus串口主站
///
private IModbusSerialMaster CreateModbusSerialMaster()
{
var port = new SerialPort(_portName)
{
BaudRate = 9600,
DataBits = 8,
Parity = Parity.None,
StopBits = StopBits.One
};
try
{
port.Open();
var adapter = new SerialPortAdapter(port)
{
ReadTimeout = 1000,
WriteTimeout = 1000
};
var factory = new ModbusFactory();
return factory.CreateRtuMaster(adapter);
}
catch
{
port.Dispose();
throw;
}
}
}