ソースを参照

添加全局事件委托器,并重构modbus线圈和寄存器的读写

dev-2
永攀 张 2週間前
コミット
c7e5997eb3
12個のファイルの変更222行の追加161行の削除
  1. +1
    -6
      ModbusDemo/App.xaml.cs
  2. +100
    -103
      ModbusDemo/Device/ModbusRTU.cs
  3. +14
    -0
      ModbusDemo/Event/SerialPortSettingsChangedEvent .cs
  4. +1
    -3
      ModbusDemo/Model/ModbusDbContext.cs
  5. +1
    -1
      ModbusDemo/Uitls/CheckData.cs
  6. +3
    -1
      ModbusDemo/VIew/CoilUC.xaml
  7. +3
    -0
      ModbusDemo/VIew/RegisterUC.xaml
  8. +2
    -0
      ModbusDemo/VIew/SettingsUC.xaml
  9. +35
    -34
      ModbusDemo/VIewModel/AttachUCViewModel.cs
  10. +23
    -6
      ModbusDemo/VIewModel/CoilUCViewModel.cs
  11. +17
    -3
      ModbusDemo/VIewModel/RegisterUCViewModel.cs
  12. +22
    -4
      ModbusDemo/VIewModel/SettingsUCViewModel.cs

+ 1
- 6
ModbusDemo/App.xaml.cs ファイルの表示

@@ -77,12 +77,7 @@ namespace ModbusDemo



//private SerialPort CreateSerialPort()
//{
// SerialPort serialPort = new SerialPort();
// return serialPort;
//}
}

}

+ 100
- 103
ModbusDemo/Device/ModbusRTU.cs ファイルの表示

@@ -1,4 +1,5 @@
using ModbusDemo.Model;
using DryIoc;
using ModbusDemo.Model;
using ModbusDemo.Uitls;
using System;
using System.Collections.Generic;
@@ -19,7 +20,7 @@ namespace ModbusDemo.Device
private ModbusDbContext _modbusDbContext;
//TODO,修改
private SerialPortAdapter _portAdapter;
public ModbusRTU(SerialPort serialPort, ModbusDbContext modbusDbContext)
{
_serialPort = serialPort;
@@ -42,17 +43,16 @@ namespace ModbusDemo.Device
MessageBox.Show("串口没有链接,请先链接");
return resultValue;
}
List<byte> sendByteList = new List<byte>();
//设置从站地址
sendByteList.Add(slaveAddress);
//设置功能码
sendByteList.Add(0x01);
List<byte> sendByteList = new List<byte>
{
slaveAddress, // 从站地址
0x01, // 功能码:读线圈
};

//设置起始地址的高位和低位
sendByteList.Add(BitConverter.GetBytes(startAddress)[1]);
sendByteList.Add(BitConverter.GetBytes(startAddress)[0]);
sendByteList.AddRange(BitConverter.GetBytes(startAddress).Reverse());
//设置读取几个线圈的高位和低位
sendByteList.Add(BitConverter.GetBytes(numberOfPoints)[1]);
sendByteList.Add(BitConverter.GetBytes(numberOfPoints)[0]);
sendByteList.AddRange(BitConverter.GetBytes(numberOfPoints).Reverse());
//获取CRC校验码
byte[] getCRC = sendByteList.ToArray();
byte[] resultCRC = CRCUitl.CalculateCRC(getCRC, getCRC.Length);
@@ -114,7 +114,7 @@ namespace ModbusDemo.Device

MessageBox.Show("0x15:数据库插入错误");
}
return resultValue;
}

@@ -144,42 +144,30 @@ namespace ModbusDemo.Device

MessageBox.Show("0x15:数据库插入错误");
}


//判断发送回来的数据是否正确
if (CheckData.CheckResponse(response))
{
List<byte> responseList = new List<byte>(response);
//移除前两位
responseList.RemoveRange(0, 3);
//移除后两位校验码
responseList.RemoveRange(responseList.Count - 2, 2);
responseList.Reverse();
//数组反转之后,转为二进制字符
List<string> StringList = responseList.Select(m => Convert.ToString(m, 2)).ToList();

var result = "";

foreach (var item in StringList)
{
result += item.PadLeft(8, '0');
}
//先将字符串转为数组,再反转,再转为字节数组
char[] chars = result.ToArray().Reverse<char>().ToArray();
bool[] ultimately = new bool[numberOfPoints];
for (int i = 0; i < numberOfPoints; i++)
{
if (chars[i] == '1')
{
ultimately[i] = true;
}
else
{
ultimately[i] = false;
}
}
return ultimately;
// 移除前3个字节和后2个校验码字节,并反转数组
var processedBytes = response
.Skip(3) // 移除前3个字节
.Take(response.Count() - 5) // 保留中间部分 (总长度-5)
.Reverse() // 反转字节顺序
.ToList();

// 将每个字节转换为8位二进制字符串,不足8位时左边补0
string binaryString = string.Concat(
processedBytes.Select(b => Convert.ToString(b, 2).PadLeft(8, '0'))
);

// 反转二进制字符串中的所有位,并转换为布尔数组
return binaryString
.Reverse() // 反转所有位的顺序
.Take(numberOfPoints) // 取指定数量的位
.Select(c => c == '1') // 将字符'1'转换为true,其他转换为false
.ToArray();
}
else
{
@@ -202,35 +190,25 @@ namespace ModbusDemo.Device
MessageBox.Show("串口没有链接,请先链接");
return;
}
List<byte> sendByteList = new List<byte>();
//设置从站地址
sendByteList.Add(slaveAddress);
//设置功能码
sendByteList.Add(0x0F);
//设置起始地址的高位和低位
sendByteList.Add(BitConverter.GetBytes(startAddress)[1]);
sendByteList.Add(BitConverter.GetBytes(startAddress)[0]);
//设置写入几个线圈
sendByteList.Add(BitConverter.GetBytes(data.Length)[1]);
sendByteList.Add(BitConverter.GetBytes(data.Length)[0]);
List<byte> sendByteList = new List<byte>
{
slaveAddress, // 从站地址
0x0F, // 功能码:写多个线圈
};

// 计算字节数
int byteCount = (data.Length + 7) / 8;
sendByteList.Add((byte)byteCount);
// 添加起始地址(高字节在前,低字节在后)
sendByteList.AddRange(BitConverter.GetBytes(startAddress).Reverse());

// 初始化字节数组
byte[] coilBytes = new byte[byteCount];
// 添加线圈数量(高字节在前,低字节在后)
ushort coilCount = (ushort)data.Length;
sendByteList.AddRange(BitConverter.GetBytes(coilCount).Reverse());

// 把bool数组转换为字节
for (int i = 0; i < data.Length; i++)
{
int byteIndex = i / 8;
int bitIndex = i % 8;
if (data[i])
{
coilBytes[byteIndex] |= (byte)(1 << bitIndex);
}
}
// 计算所需字节数(每8个线圈占1字节)
int byteCount = (coilCount + 7) / 8;
sendByteList.Add((byte)byteCount);

// 将布尔数组转换为字节数组(每个位表示一个线圈状态)
byte[] coilBytes = ConvertBoolsToBytes(data);
sendByteList.AddRange(coilBytes);

//获取CRC校验码
@@ -294,12 +272,30 @@ namespace ModbusDemo.Device
MessageBox.Show("0x15:数据库插入错误");

}

//判断发送回来的数据是否正确
CheckData.CheckResponse(response);
}
/// <summary>
/// 将布尔数组转换为字节数组(每个位表示一个线圈状态)
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private static byte[] ConvertBoolsToBytes(bool[] data)
{
int byteCount = (data.Length + 7) / 8;
byte[] result = new byte[byteCount];

for (int i = 0; i < data.Length; i++)
{
if (data[i])
{
int byteIndex = i / 8;
int bitIndex = i % 8;
result[byteIndex] |= (byte)(1 << bitIndex);
}
}

return result;
}
/// <summary>
/// 读寄存器操作
@@ -316,17 +312,17 @@ namespace ModbusDemo.Device
MessageBox.Show("串口没有链接,请先链接");
return resultValue;
}
List<byte> sendByteList = new List<byte>();
//设置从站地址
sendByteList.Add(slaveAddress);
//设置功能码
sendByteList.Add(0x03);
//设置起始地址的高位和低位
sendByteList.Add(BitConverter.GetBytes(startAddress)[1]);
sendByteList.Add(BitConverter.GetBytes(startAddress)[0]);
//设置读取几个线圈的高位和低位
sendByteList.Add(BitConverter.GetBytes(numberOfPoints)[1]);
sendByteList.Add(BitConverter.GetBytes(numberOfPoints)[0]);
var sendByteList = new List<byte>(8)
{
slaveAddress, // 从站地址
0x03, // 功能码:读保持寄存器
};
// 添加起始地址(高字节在前)
sendByteList.AddRange(BitConverter.GetBytes(startAddress).Reverse());
// 添加读取点数(高字节在前)
sendByteList.AddRange(BitConverter.GetBytes(numberOfPoints).Reverse());
//获取CRC校验码
byte[] getCRC = sendByteList.ToArray();
byte[] resultCRC = CRCUitl.CalculateCRC(getCRC, getCRC.Length);
@@ -390,7 +386,7 @@ namespace ModbusDemo.Device

MessageBox.Show("0x15:数据库插入错误");
}
return resultValue;


@@ -422,7 +418,7 @@ namespace ModbusDemo.Device
MessageBox.Show("0x15:数据库插入错误");

}

//判断发送回来的数据是否正确
if (CheckData.CheckResponse(response))
@@ -459,28 +455,29 @@ namespace ModbusDemo.Device
MessageBox.Show("串口没有链接,请先链接");
return;
}
List<byte> sendByteList = new List<byte>();
//设置从站地址
sendByteList.Add(slaveAddress);
//设置功能码
sendByteList.Add(0x10);
//设置起始地址的高位和低位
sendByteList.Add(BitConverter.GetBytes(startAddress)[1]);
sendByteList.Add(BitConverter.GetBytes(startAddress)[0]);
//设置写入几个线圈
sendByteList.Add(BitConverter.GetBytes(data.Length)[1]);
sendByteList.Add(BitConverter.GetBytes(data.Length)[0]);
// 计算字节数 (每个寄存器占2字节)
int byteCount = (data.Length) * 2;

// 计算字节数
int byteCount = (data.Length + 7) / 8;
// 预分配列表容量,避免多次扩容
var sendByteList = new List<byte>(9 + byteCount)
{
slaveAddress, // 从站地址
0x10, // 功能码:写多个保持寄存器
};

// 添加起始地址(高字节在前)
sendByteList.AddRange(BitConverter.GetBytes(startAddress).Reverse());

// 添加寄存器数量(高字节在前)
sendByteList.AddRange(BitConverter.GetBytes((ushort)data.Length).Reverse());

// 添加字节数
sendByteList.Add((byte)byteCount);

// 添加寄存器数据(每个寄存器2字节,高字节在前)
foreach (ushort value in data)
{
byte[] valueBytes = BitConverter.GetBytes(value);
// 大端序:高字节在前,低字节在后
sendByteList.Add(valueBytes[1]);
sendByteList.Add(valueBytes[0]);
sendByteList.AddRange(BitConverter.GetBytes(value).Reverse());
}

//获取CRC校验码
@@ -544,7 +541,7 @@ namespace ModbusDemo.Device
MessageBox.Show("0x15:数据库插入错误");
}


//判断发送回来的数据是否正确
CheckData.CheckResponse(response);


+ 14
- 0
ModbusDemo/Event/SerialPortSettingsChangedEvent .cs ファイルの表示

@@ -0,0 +1,14 @@
using Prism.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ModbusDemo.Event
{
public class SerialPortSettingsChangedEvent: PubSubEvent
{

}
}

+ 1
- 3
ModbusDemo/Model/ModbusDbContext.cs ファイルの表示

@@ -12,9 +12,7 @@ namespace ModbusDemo.Model
/// </summary>
public class ModbusDbContext:DbContext
{
protected ModbusDbContext()
{
}
public ModbusDbContext(DbContextOptions<ModbusDbContext> options) :base(options)
{


+ 1
- 1
ModbusDemo/Uitls/CheckData.cs ファイルの表示

@@ -16,7 +16,7 @@ namespace ModbusDemo.Uitls
/// <returns></returns>
public static bool CheckResponse(byte[] response)
{
if (response.Length == 0)
if (response == null || response.Length == 0)
{
MessageBox.Show("返回数据为空", "error", MessageBoxButton.OK, MessageBoxImage.Error);
return false;


+ 3
- 1
ModbusDemo/VIew/CoilUC.xaml ファイルの表示

@@ -57,6 +57,7 @@
<RowDefinition Height="60">
</RowDefinition>
</Grid.RowDefinitions>
<!-- 线圈的读取 -->
<StackPanel HorizontalAlignment="Center" Orientation="Vertical">
<TextBlock Margin="20" Text="从站地址">
</TextBlock>
@@ -109,6 +110,7 @@
<ColumnDefinition>
</ColumnDefinition>
</Grid.ColumnDefinitions>
<!-- 线圈的写入 -->
<StackPanel HorizontalAlignment="Center" Orientation="Vertical">
<TextBlock Margin="20" Text="从站地址">
</TextBlock>
@@ -149,7 +151,7 @@
Style="{StaticResource MaterialDesignRaisedDarkButton}">
</Button>
</Grid>
<!-- 展示历史读取数据 -->
<Grid Grid.Row="3">
<DataGrid ItemsSource="{Binding ModbusLogList}" AutoGenerateColumns="False" IsReadOnly="True" ColumnWidth="*">
<DataGrid.Columns>


+ 3
- 0
ModbusDemo/VIew/RegisterUC.xaml ファイルの表示

@@ -57,6 +57,7 @@
<RowDefinition Height="60">
</RowDefinition>
</Grid.RowDefinitions>
<!--读寄存器-->
<StackPanel HorizontalAlignment="Center" Orientation="Vertical">
<TextBlock Margin="20" Text="从站地址">
</TextBlock>
@@ -109,6 +110,7 @@
<ColumnDefinition>
</ColumnDefinition>
</Grid.ColumnDefinitions>
<!--写寄存器-->
<StackPanel HorizontalAlignment="Center" Orientation="Vertical">
<TextBlock Margin="20" Text="从站地址">
</TextBlock>
@@ -150,6 +152,7 @@
</Button>
</Grid>
<Grid Grid.Row="3">
<!--数据展示-->
<DataGrid ItemsSource="{Binding ModbusLogList}" AutoGenerateColumns="False" IsReadOnly="True" ColumnWidth="*">
<DataGrid.Columns>
<!-- 操作类型列 -->


+ 2
- 0
ModbusDemo/VIew/SettingsUC.xaml ファイルの表示

@@ -61,6 +61,8 @@
<ComboBoxItem Content="COM2" />
<ComboBoxItem Content="COM3" />
<ComboBoxItem Content="COM4" />
<ComboBoxItem Content="COM5" />
<ComboBoxItem Content="COM6" />
</ComboBox>
</StackPanel>
<!-- 设置波特率 -->


+ 35
- 34
ModbusDemo/VIewModel/AttachUCViewModel.cs ファイルの表示

@@ -95,7 +95,7 @@ namespace ModbusDemo.VIewModel
int count = 0;
for (int i = 1; i < totalRegisters; i += 2)
{
result.Append(allRegisters[i].ToString()+" ");
result.Append(allRegisters[i].ToString() + " ");
count++;
if (count % 50 == 0)
{
@@ -105,7 +105,9 @@ namespace ModbusDemo.VIewModel
ReadResult = result.ToString();

}

/// <summary>
/// 自己的类
/// </summary>
private void ReadOddRegister2()
{
byte slaveId = 1;
@@ -122,13 +124,13 @@ namespace ModbusDemo.VIewModel
ushort currentChunkSize = 100;

int chunkIndex = i;
tasks[i] = Task.Run(() =>
tasks[i] = Task.Run(async () =>
{
ushort[] registers = ReadRegisters(slaveId, startAddress, currentChunkSize);
Array.Copy(registers, 0, allRegisters, chunkIndex * chunkSize, currentChunkSize);
ushort[] registers = await ReadRegisters(slaveId, startAddress, currentChunkSize);
Array.Copy(registers, 0, allRegisters, chunkIndex * chunkSize, currentChunkSize);
});
}

@@ -150,9 +152,9 @@ namespace ModbusDemo.VIewModel
}


public ushort[] ReadRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints)
public async Task<ushort[]> ReadRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints)
{
object _lock = new object();
ushort[] resultValue = null;
if (!_serialPort.IsOpen)
{
@@ -186,41 +188,40 @@ namespace ModbusDemo.VIewModel
{
try
{
lock (_lock)
{


//使用时间去轮询查询数据
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)

//使用时间去轮询查询数据
DateTime startTime = DateTime.Now;
while ((DateTime.Now - startTime).TotalMilliseconds < _serialPort.ReadTimeout)
{
int bytesToRead = _serialPort.BytesToRead;
if (bytesToRead > 0)
{
continue;
byte[] buffer = new byte[bytesToRead];
int bytesRead = _serialPort.Read(buffer, 0, bytesToRead);
responseData.AddRange(buffer.Take(bytesRead));
}
resultValue = ParseRegistersresponse(sendByte, response, numberOfPoints);
return resultValue;
//延迟20毫秒,节约cpu资源
await Task.Delay(20);
}
response = responseData.ToArray();
if (response[0] == 0x00)
{
continue;
}
resultValue = ParseRegistersresponse(sendByte, response, numberOfPoints);
return resultValue;

}
catch (Exception)
{

attempt++;
}
}
return resultValue;


@@ -229,7 +230,7 @@ namespace ModbusDemo.VIewModel

public ushort[] ParseRegistersresponse(byte[] sendByte, byte[] response, ushort numberOfPoints)
{

//判断发送回来的数据是否正确
if (CheckData.CheckResponse(response))


+ 23
- 6
ModbusDemo/VIewModel/CoilUCViewModel.cs ファイルの表示

@@ -1,6 +1,8 @@
using ModbusDemo.Device;
using ModbusDemo.Event;
using ModbusDemo.Model;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
@@ -17,6 +19,9 @@ namespace ModbusDemo.VIewModel
/// </summary>
public class CoilUCViewModel : BindableBase
{

//事件聚合器
private readonly IEventAggregator _eventAggregator;
//定义数据库操作
private ModbusDbContext _modbusDbContext;
//获取读线圈的类
@@ -41,8 +46,8 @@ namespace ModbusDemo.VIewModel
RaisePropertyChanged();
}
}
public string SerialPortInfo
public string SerialPortInfo
{
get
{
@@ -50,9 +55,10 @@ namespace ModbusDemo.VIewModel
+ ",数据位:" + _serialPort.DataBits + ",校验位:" + _serialPort.Parity + ",停止位:" + _serialPort.StopBits;
}


}


#region 读取定义

//读取的从站id
@@ -170,18 +176,29 @@ namespace ModbusDemo.VIewModel

}

public CoilUCViewModel(SerialPort serialPort, ModbusRTU modbusRTU, ModbusDbContext modbusDbContext)
public CoilUCViewModel(SerialPort serialPort, ModbusRTU modbusRTU, ModbusDbContext modbusDbContext, IEventAggregator eventAggregator)
{
_serialPort = serialPort;
ReadCoilCmm = new DelegateCommand(ReadCoil);
_modbusRTU = modbusRTU;
WriteCoilCmm = new DelegateCommand(WriteCoil);
_modbusDbContext = modbusDbContext;
_eventAggregator = eventAggregator;
// 订阅事件(使用弱引用,避免内存泄漏)
_eventAggregator.GetEvent<SerialPortSettingsChangedEvent>().Subscribe(
OnSerialPortSettingsChanged,
ThreadOption.UIThread, // 在UI线程执行回调
false);// 不使用强引用
//初始化查询操作
ModbusLogList = GetOperateCoil();
IsEnable = true;
}

// 事件回调方法:当串口设置变更时触发
private void OnSerialPortSettingsChanged()
{
// 强制刷新SerialPortInfo属性,触发UI更新
RaisePropertyChanged(nameof(SerialPortInfo));
}
/// <summary>
/// 线圈读取操作
/// </summary>


+ 17
- 3
ModbusDemo/VIewModel/RegisterUCViewModel.cs ファイルの表示

@@ -1,6 +1,8 @@
using ModbusDemo.Device;
using ModbusDemo.Event;
using ModbusDemo.Model;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
@@ -14,6 +16,8 @@ namespace ModbusDemo.VIewModel
{
class RegisterUCViewModel : BindableBase
{
//事件聚合器
private readonly IEventAggregator _eventAggregator;
//定义数据库操作类
private ModbusDbContext _modbusDbContext;
//获取读线圈的类
@@ -163,19 +167,29 @@ namespace ModbusDemo.VIewModel
{

}
public RegisterUCViewModel(SerialPort serialPort, ModbusRTU modbusRTU, ModbusDbContext modbusDbContext)
public RegisterUCViewModel(SerialPort serialPort, ModbusRTU modbusRTU, ModbusDbContext modbusDbContext, IEventAggregator eventAggregator)
{
_serialPort = serialPort;
ReadRegisterCmm = new DelegateCommand(ReadRegister);
_modbusRTU = modbusRTU;
WriteRegisterCmm = new DelegateCommand(WriteRegister);
_modbusDbContext = modbusDbContext;

_eventAggregator = eventAggregator;
// 订阅事件(使用弱引用,避免内存泄漏)
_eventAggregator.GetEvent<SerialPortSettingsChangedEvent>().Subscribe(
OnSerialPortSettingsChanged,
ThreadOption.UIThread, // 在UI线程执行回调
false);// 不使用强引用
ModbusLogList = GetOperateRegister();

IsEnable = true;
}

// 事件回调方法:当串口设置变更时触发
private void OnSerialPortSettingsChanged()
{
// 强制刷新SerialPortInfo属性,触发UI更新
RaisePropertyChanged(nameof(SerialPortInfo));
}





+ 22
- 4
ModbusDemo/VIewModel/SettingsUCViewModel.cs ファイルの表示

@@ -1,5 +1,7 @@
using ModbusDemo.Uitls;
using ModbusDemo.Event;
using ModbusDemo.Uitls;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using System;
@@ -15,6 +17,8 @@ namespace ModbusDemo.VIewModel
class SettingsUCViewModel : BindableBase
{
//事件聚合器
private readonly IEventAggregator _eventAggregator;
//控制页面跳转
private readonly IRegionManager _regionManager;
//断开连接的命令
@@ -97,12 +101,13 @@ namespace ModbusDemo.VIewModel
/// 从容器中获取创建的窗口
/// </summary>
/// <param name="serialPort"></param>
public SettingsUCViewModel(SerialPort serialPort, IRegionManager regionManager)
public SettingsUCViewModel(SerialPort serialPort, IRegionManager regionManager, IEventAggregator eventAggregator)
{
_serialPort = serialPort;
ConnectionCmm = new DelegateCommand(Connection);
DisConnectionCmm = new DelegateCommand(DisConnection);
_regionManager = regionManager;
_eventAggregator = eventAggregator;
}

private void DisConnection()
@@ -110,8 +115,9 @@ namespace ModbusDemo.VIewModel
if (_serialPort.IsOpen)
{
_serialPort.Close();
MessageBox.Show("连接已经断开");
}
MessageBox.Show("连接已经断开");
}

/// <summary>
@@ -126,8 +132,14 @@ namespace ModbusDemo.VIewModel
_serialPort.PortName = GetComboBoxItemValue(this.PortName);
_serialPort.BaudRate = int.Parse(GetComboBoxItemValue(this.BaudRate));
_serialPort.Parity = this.Parity;
if (this.StopBits == StopBits.None)
{
this.StopBits = StopBits.One;
MessageBox.Show("当前设备不支持无停止位(None)模式,已自动切换为 1 个停止位。");
}
_serialPort.StopBits = this.StopBits;
_serialPort.DataBits = int.Parse(GetComboBoxItemValue(this.DataBits));
//读取超时时间
_serialPort.ReadTimeout = 500;
//写入超时时间
@@ -135,6 +147,8 @@ namespace ModbusDemo.VIewModel
try
{
_serialPort.Open();
// 发布事件通知其他ViewModel
_eventAggregator.GetEvent<SerialPortSettingsChangedEvent>().Publish();
MessageBox.Show("串口链接成功");
_regionManager.Regions["ModbusRegion"].RequestNavigate("CoilUC");

@@ -142,9 +156,13 @@ namespace ModbusDemo.VIewModel
catch (Exception)
{

MessageBox.Show("串口已经链接,请先断开链接在尝试","warning",MessageBoxButton.OK,MessageBoxImage.Warning);
MessageBox.Show("串口已经链接或者断开,请重新检查在尝试","warning",MessageBoxButton.OK,MessageBoxImage.Warning);
}
}
else
{
MessageBox.Show("当前串口已经连接,请先断开,再连接");
}
}
/// <summary>


読み込み中…
キャンセル
保存