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.

222 líneas
6.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. using System.Timers;
  15. using Timer = System.Timers.Timer;
  16. using ModbusDemo.Device;
  17. namespace ModbusDemo.VIewModel
  18. {
  19. class SettingsUCViewModel : BindableBase
  20. {
  21. //
  22. private ModbusRTU _modbusRTU;
  23. //定时器
  24. private readonly Timer _checkTimer;
  25. //事件聚合器
  26. private readonly IEventAggregator _eventAggregator;
  27. //控制页面跳转
  28. private readonly IRegionManager _regionManager;
  29. //断开连接的命令
  30. public DelegateCommand DisConnectionCmm { get; set; }
  31. //链接窗口的命令
  32. public DelegateCommand ConnectionCmm { get; set; }
  33. //获取串口
  34. private SerialPort _serialPort;
  35. //设置串口名字
  36. private string _portName = "COM3";
  37. public string PortName
  38. {
  39. get { return _portName; }
  40. set
  41. {
  42. _portName = value;
  43. RaisePropertyChanged();
  44. }
  45. }
  46. //设置波特率
  47. private string _baudRate = "9600";
  48. public string BaudRate
  49. {
  50. get { return _baudRate; }
  51. set
  52. {
  53. _baudRate = value;
  54. RaisePropertyChanged();
  55. }
  56. }
  57. //设置数据位
  58. private string _dataBits = "8";
  59. public string DataBits
  60. {
  61. get { return _dataBits; }
  62. set
  63. {
  64. _dataBits = value;
  65. RaisePropertyChanged();
  66. }
  67. }
  68. //设置校验位
  69. private Parity _parity = Parity.Even;
  70. public Parity Parity
  71. {
  72. get { return _parity; }
  73. set
  74. {
  75. _parity = value;
  76. RaisePropertyChanged();
  77. }
  78. }
  79. //设置停止位
  80. private StopBits _stopBits = StopBits.One;
  81. public StopBits StopBits
  82. {
  83. get { return _stopBits; }
  84. set
  85. {
  86. _stopBits = value;
  87. RaisePropertyChanged();
  88. }
  89. }
  90. //设置读取和写入时间
  91. private string _timeOut = "200";
  92. public string TimeOut
  93. {
  94. get { return _timeOut; }
  95. set
  96. {
  97. _timeOut = value;
  98. RaisePropertyChanged();
  99. }
  100. }
  101. public SettingsUCViewModel()
  102. {
  103. }
  104. /// <summary>
  105. /// 从容器中获取创建的窗口
  106. /// </summary>
  107. /// <param name="serialPort"></param>
  108. public SettingsUCViewModel(SerialPort serialPort, IRegionManager regionManager, IEventAggregator eventAggregator, ModbusRTU modbusRTU)
  109. {
  110. _serialPort = serialPort;
  111. ConnectionCmm = new DelegateCommand(Connection);
  112. DisConnectionCmm = new DelegateCommand(DisConnection);
  113. _regionManager = regionManager;
  114. _eventAggregator = eventAggregator;
  115. _modbusRTU = modbusRTU;
  116. _checkTimer = new Timer(5000); // 每秒检查一次
  117. _checkTimer.Elapsed += CheckPortStatus;
  118. _checkTimer.AutoReset = true;
  119. }
  120. private void CheckPortStatus(object sender, ElapsedEventArgs e)
  121. {
  122. //bool isConnected = SerialPort.GetPortNames().Contains(PortName);
  123. byte[] bytes = new byte[] { 0x01, 0x01, 0x01, 0x2C, 0x00, 0x01, 0x3D, 0xFF };
  124. byte[] response = _modbusRTU.SendMessage(bytes);
  125. if (response ==null)
  126. {
  127. _checkTimer.Stop();
  128. _serialPort.Close();
  129. MessageBox.Show("当前连接已经断开");
  130. }
  131. }
  132. private void DisConnection()
  133. {
  134. if (_serialPort.IsOpen)
  135. {
  136. _checkTimer.Stop();
  137. _serialPort.Close();
  138. }
  139. MessageBox.Show("连接已经断开");
  140. }
  141. /// <summary>
  142. /// 串口参数设置
  143. /// </summary>
  144. private void Connection()
  145. {
  146. //TODO,做数据的判空处理
  147. if (!_serialPort.IsOpen)
  148. {
  149. _serialPort.PortName = GetComboBoxItemValue(this.PortName);
  150. _serialPort.BaudRate = int.Parse(GetComboBoxItemValue(this.BaudRate));
  151. _serialPort.Parity = this.Parity;
  152. if (this.StopBits == StopBits.None)
  153. {
  154. this.StopBits = StopBits.One;
  155. MessageBox.Show("当前设备不支持无停止位(None)模式,已自动切换为 1 个停止位。");
  156. }
  157. _serialPort.StopBits = this.StopBits;
  158. _serialPort.DataBits = int.Parse(GetComboBoxItemValue(this.DataBits));
  159. //读取超时时间
  160. _serialPort.ReadTimeout = int.Parse(GetComboBoxItemValue(this.TimeOut));
  161. //写入超时时间
  162. _serialPort.WriteTimeout = int.Parse(GetComboBoxItemValue(this.TimeOut));
  163. try
  164. {
  165. _serialPort.Open();
  166. // 发布事件通知其他ViewModel
  167. _eventAggregator.GetEvent<SerialPortSettingsChangedEvent>().Publish();
  168. MessageBox.Show("串口链接成功");
  169. _regionManager.Regions["ModbusRegion"].RequestNavigate("CoilUC");
  170. _checkTimer.Start();
  171. }
  172. catch (Exception)
  173. {
  174. MessageBox.Show("串口已经链接或者断开,请重新检查在尝试", "warning", MessageBoxButton.OK, MessageBoxImage.Warning);
  175. }
  176. }
  177. else
  178. {
  179. MessageBox.Show("当前串口已经连接,请先断开,再连接");
  180. }
  181. }
  182. /// <summary>
  183. /// 处理下拉框的选择信息
  184. /// </summary>
  185. /// <param name="ComboBoxItem"></param>
  186. /// <returns></returns>
  187. private string GetComboBoxItemValue(string ComboBoxItem)
  188. {
  189. string displayText = ComboBoxItem.ToString();
  190. string cleanText = displayText.Replace("System.Windows.Controls.ComboBoxItem: ", "");
  191. return cleanText;
  192. }
  193. }
  194. }