No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

198 líneas
5.5 KiB

  1. using ModbusDemo.Event;
  2. using ModbusDemo.Uitls;
  3. using Prism.Commands;
  4. using Prism.Events;
  5. using Prism.Mvvm;
  6. using Prism.Regions;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.IO.Ports;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Windows;
  14. namespace ModbusDemo.VIewModel
  15. {
  16. class SettingsUCViewModel : BindableBase
  17. {
  18. //事件聚合器
  19. private readonly IEventAggregator _eventAggregator;
  20. //控制页面跳转
  21. private readonly IRegionManager _regionManager;
  22. //断开连接的命令
  23. public DelegateCommand DisConnectionCmm { get; set; }
  24. //链接窗口的命令
  25. public DelegateCommand ConnectionCmm { get; set; }
  26. //获取串口
  27. private SerialPort _serialPort;
  28. //设置串口名字
  29. private string _portName = "COM3";
  30. public string PortName
  31. {
  32. get { return _portName; }
  33. set
  34. {
  35. _portName = value;
  36. RaisePropertyChanged();
  37. }
  38. }
  39. //设置波特率
  40. private string _baudRate = "9600";
  41. public string BaudRate
  42. {
  43. get { return _baudRate; }
  44. set
  45. {
  46. _baudRate = value;
  47. RaisePropertyChanged();
  48. }
  49. }
  50. //设置数据位
  51. private string _dataBits = "8";
  52. public string DataBits
  53. {
  54. get { return _dataBits; }
  55. set
  56. {
  57. _dataBits = value;
  58. RaisePropertyChanged();
  59. }
  60. }
  61. //设置校验位
  62. private Parity _parity = Parity.Even;
  63. public Parity Parity
  64. {
  65. get { return _parity; }
  66. set
  67. {
  68. _parity = value;
  69. RaisePropertyChanged();
  70. }
  71. }
  72. //设置停止位
  73. private StopBits _stopBits = StopBits.One;
  74. public StopBits StopBits
  75. {
  76. get { return _stopBits; }
  77. set
  78. {
  79. _stopBits = value;
  80. RaisePropertyChanged();
  81. }
  82. }
  83. //设置读取和写入时间
  84. private string _timeOut = "200";
  85. public string TimeOut
  86. {
  87. get { return _timeOut; }
  88. set
  89. {
  90. _timeOut = value;
  91. RaisePropertyChanged();
  92. }
  93. }
  94. public SettingsUCViewModel()
  95. {
  96. }
  97. /// <summary>
  98. /// 从容器中获取创建的窗口
  99. /// </summary>
  100. /// <param name="serialPort"></param>
  101. public SettingsUCViewModel(SerialPort serialPort, IRegionManager regionManager, IEventAggregator eventAggregator)
  102. {
  103. _serialPort = serialPort;
  104. ConnectionCmm = new DelegateCommand(Connection);
  105. DisConnectionCmm = new DelegateCommand(DisConnection);
  106. _regionManager = regionManager;
  107. _eventAggregator = eventAggregator;
  108. }
  109. private void DisConnection()
  110. {
  111. if (_serialPort.IsOpen)
  112. {
  113. _serialPort.Close();
  114. }
  115. MessageBox.Show("连接已经断开");
  116. }
  117. /// <summary>
  118. /// 串口参数设置
  119. /// </summary>
  120. private void Connection()
  121. {
  122. //TODO,做数据的判空处理
  123. if (!_serialPort.IsOpen)
  124. {
  125. _serialPort.PortName = GetComboBoxItemValue(this.PortName);
  126. _serialPort.BaudRate = int.Parse(GetComboBoxItemValue(this.BaudRate));
  127. _serialPort.Parity = this.Parity;
  128. if (this.StopBits == StopBits.None)
  129. {
  130. this.StopBits = StopBits.One;
  131. MessageBox.Show("当前设备不支持无停止位(None)模式,已自动切换为 1 个停止位。");
  132. }
  133. _serialPort.StopBits = this.StopBits;
  134. _serialPort.DataBits = int.Parse(GetComboBoxItemValue(this.DataBits));
  135. //读取超时时间
  136. _serialPort.ReadTimeout = int.Parse(GetComboBoxItemValue(this.TimeOut));
  137. //写入超时时间
  138. _serialPort.WriteTimeout = int.Parse(GetComboBoxItemValue(this.TimeOut));
  139. try
  140. {
  141. _serialPort.Open();
  142. // 发布事件通知其他ViewModel
  143. _eventAggregator.GetEvent<SerialPortSettingsChangedEvent>().Publish();
  144. MessageBox.Show("串口链接成功");
  145. _regionManager.Regions["ModbusRegion"].RequestNavigate("CoilUC");
  146. }
  147. catch (Exception)
  148. {
  149. MessageBox.Show("串口已经链接或者断开,请重新检查在尝试", "warning", MessageBoxButton.OK, MessageBoxImage.Warning);
  150. }
  151. }
  152. else
  153. {
  154. MessageBox.Show("当前串口已经连接,请先断开,再连接");
  155. }
  156. }
  157. /// <summary>
  158. /// 处理下拉框的选择信息
  159. /// </summary>
  160. /// <param name="ComboBoxItem"></param>
  161. /// <returns></returns>
  162. private string GetComboBoxItemValue(string ComboBoxItem)
  163. {
  164. string displayText = ComboBoxItem.ToString();
  165. string cleanText = displayText.Replace("System.Windows.Controls.ComboBoxItem: ", "");
  166. return cleanText;
  167. }
  168. }
  169. }