Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

171 wiersze
4.3 KiB

  1. using ModbusDemo.Uitls;
  2. using Prism.Commands;
  3. using Prism.Mvvm;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO.Ports;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace ModbusDemo.VIewModel
  11. {
  12. class SettingsUCViewModel : BindableBase
  13. {
  14. public DelegateCommand DisConnectionCmm { get; set; }
  15. //链接窗口的命令
  16. public DelegateCommand ConnectionCmm { get; set; }
  17. //获取串口
  18. private SerialPort _serialPort;
  19. //设置串口名字
  20. private string _portName = "COM1";
  21. public string PortName
  22. {
  23. get { return _portName; }
  24. set
  25. {
  26. _portName = value;
  27. RaisePropertyChanged();
  28. }
  29. }
  30. //设置波特率
  31. private string _baudRate = "19200";
  32. public string BaudRate
  33. {
  34. get { return _baudRate; }
  35. set
  36. {
  37. _baudRate = value;
  38. RaisePropertyChanged();
  39. }
  40. }
  41. //设置数据位
  42. private string _dataBits = "8";
  43. public string DataBits
  44. {
  45. get { return _dataBits; }
  46. set
  47. {
  48. _dataBits = value;
  49. RaisePropertyChanged();
  50. }
  51. }
  52. //设置校验位
  53. private Parity _parity = Parity.Even;
  54. public Parity Parity
  55. {
  56. get { return _parity; }
  57. set
  58. {
  59. _parity = value;
  60. RaisePropertyChanged();
  61. }
  62. }
  63. //设置停止位
  64. private StopBits _stopBits = StopBits.One;
  65. public StopBits StopBits
  66. {
  67. get { return _stopBits; }
  68. set
  69. {
  70. _stopBits = value;
  71. RaisePropertyChanged();
  72. }
  73. }
  74. public SettingsUCViewModel()
  75. {
  76. }
  77. /// <summary>
  78. /// 从容器中获取创建的窗口
  79. /// </summary>
  80. /// <param name="serialPort"></param>
  81. public SettingsUCViewModel(SerialPort serialPort)
  82. {
  83. _serialPort = serialPort;
  84. ConnectionCmm = new DelegateCommand(Connection);
  85. DisConnectionCmm = new DelegateCommand(DisConnection);
  86. }
  87. private void DisConnection()
  88. {
  89. if (_serialPort.IsOpen)
  90. {
  91. _serialPort.Close();
  92. }
  93. }
  94. /// <summary>
  95. /// 串口参数设置
  96. /// </summary>
  97. private void Connection()
  98. {
  99. //todo,做数据的判空处理
  100. if (!_serialPort.IsOpen)
  101. {
  102. _serialPort.PortName = GetComboBoxItemValue(this.PortName);
  103. _serialPort.BaudRate = int.Parse(GetComboBoxItemValue(this.BaudRate));
  104. _serialPort.Parity = this.Parity;
  105. _serialPort.StopBits = this.StopBits;
  106. _serialPort.DataBits = int.Parse(GetComboBoxItemValue(this.DataBits));
  107. _serialPort.Open();
  108. }
  109. List<byte> bytes = new List<byte>();
  110. bytes.Add(0x01);
  111. bytes.Add(0x05);
  112. bytes.Add(BitConverter.GetBytes(301)[1]);
  113. bytes.Add(BitConverter.GetBytes(301)[0]);
  114. bytes.Add(0xFF);
  115. bytes.Add(0x00);
  116. byte[] bytes1 = CRCUitl.CalculateCRC(bytes.ToArray(), bytes.Count);
  117. bytes.Add(bytes1[0]);
  118. bytes.Add(bytes1[1]);
  119. byte[] bytes2 = bytes.ToArray();
  120. System.Threading.Thread.Sleep(200); // 等待200毫秒
  121. byte[] response = new byte[_serialPort.BytesToRead];
  122. //int bytesRead = serialPort.Read(response, 0, response.Length);
  123. //string hexResponse = BitConverter.ToString(response, 0, bytesRead);
  124. _serialPort.Write(bytes2, 0, bytes2.Length);
  125. }
  126. /// <summary>
  127. /// 处理下拉框的选择信息
  128. /// </summary>
  129. /// <param name="ComboBoxItem"></param>
  130. /// <returns></returns>
  131. private string GetComboBoxItemValue(string ComboBoxItem)
  132. {
  133. string displayText = ComboBoxItem.ToString();
  134. string cleanText = displayText.Replace("System.Windows.Controls.ComboBoxItem: ", "");
  135. return cleanText;
  136. }
  137. }
  138. }