DeviceSerial.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace YG.Device
  7. {
  8. public class DeviceSerial : DeviceList
  9. {
  10. public override event RunMessage Msg;
  11. public override event RunState rState;
  12. System.IO.Ports.SerialPort serialPort;
  13. private SendState sendState;
  14. int SendCount = 0;
  15. int leng = 0;
  16. byte[] bt;
  17. private bool _ison = false;
  18. /// <summary>
  19. /// 串口超时时间
  20. /// </summary>
  21. public override bool IsOn
  22. {
  23. get { return _ison; }
  24. set
  25. {
  26. if (_ison != value)
  27. {
  28. if (rState != null)
  29. {
  30. rState.Invoke(this.DeviceName, value); _ison = value;
  31. }
  32. }
  33. }
  34. }
  35. public override void DeviceState()
  36. {
  37. Task.Factory.StartNew(() =>
  38. {
  39. while (true)
  40. {
  41. System.Threading.Thread.Sleep(1000);
  42. try
  43. {
  44. if (serialPort.IsOpen) { IsOn = true; }
  45. else { IsOn = false; serialPort.Open(); }
  46. }
  47. catch
  48. {
  49. IsOn = false;
  50. serialPort.Open();
  51. }
  52. finally
  53. {
  54. }
  55. }
  56. });
  57. }
  58. /// <summary>
  59. ///
  60. /// </summary>
  61. /// <param name="portname">串口名称</param>
  62. /// <param name="buard">波特率</param>
  63. public DeviceSerial(string portname, int buard, int outtime = 2500)
  64. {
  65. serialPort = new System.IO.Ports.SerialPort(portname, buard);
  66. serialPort.DataReceived += SerialPort_DataReceived;
  67. serialPort.ReadTimeout = 100;
  68. serialPort.WriteTimeout = 100;
  69. timeout = outtime;
  70. this.DeviceName = portname;
  71. }
  72. public override void DeviceCheck()
  73. {
  74. System.Threading.Thread.Sleep(timeout);
  75. while (sendState == SendState.SendNoReceive)
  76. {
  77. serialPort.Write(SendValue.ToString());
  78. base.DeviceSend(SendValue);
  79. //一般情况下在延迟一段时间之后, 如果没有收到串口反馈的指令,那么下次发送也很难再接受到反馈, 所以下边默认延迟1500毫秒
  80. System.Threading.Thread.Sleep(1500);
  81. SendCount++;
  82. if (SendCount > 3)
  83. {
  84. if (Msg != null)
  85. {
  86. Msg.Invoke(this.DeviceName, SendValue.Replace("\r", "").Replace("\n", ""), "连续发送三次数据没有得到回应");
  87. sendState = SendState.StartSend;
  88. }
  89. }
  90. }
  91. }
  92. public override void DeviceClose()
  93. {
  94. if (serialPort.IsOpen)
  95. serialPort.Close();
  96. base.DeviceClose();
  97. }
  98. public override void DeviceInit()
  99. {
  100. sendState = SendState.StartSend;
  101. IsOn = true;
  102. IsOn = false;
  103. }
  104. public override void DeviceOpen()
  105. {
  106. try
  107. {
  108. if (!serialPort.IsOpen)
  109. serialPort.Open();
  110. }
  111. catch
  112. {
  113. YG.Log.Instance.WriteLogAdd(serialPort.PortName + "打开失败");
  114. System.Windows.Forms.MessageBox.Show(serialPort.PortName + "打开失败");
  115. }
  116. base.DeviceOpen();
  117. }
  118. public override void DeviceSend(object ob)
  119. {
  120. try
  121. {
  122. SendCount = 0;
  123. SendValue = ob.ToString();
  124. serialPort.Write(ob.ToString());
  125. base.DeviceSend(ob);
  126. sendState = SendState.SendNoReceive;
  127. Task.Factory.StartNew(() =>
  128. {
  129. if (timeout > 0)
  130. {
  131. // DeviceCheck();
  132. }
  133. });
  134. }
  135. catch (Exception ex)
  136. {
  137. Log.Instance.WriteLogAdd("串口打开失败:" + ex.Message);
  138. }
  139. }
  140. private void SerialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
  141. {
  142. System.Threading.Thread.Sleep(50);
  143. sendState = SendState.Received;
  144. if (Msg != null)
  145. {
  146. sendState = SendState.Received;
  147. // if (Msg != null)
  148. {
  149. leng = serialPort.BytesToRead;
  150. bt = new byte[leng];
  151. serialPort.Read(bt, 0, bt.Length);
  152. Task.Factory.StartNew(() => {
  153. Msg?.Invoke(this.DeviceName, SendValue.Replace("\r", "").Replace("\n", ""), Encoding.Default.GetString(bt)); });
  154. YG.Log.Instance.WriteLogAdd(string.Format("{0}:接受到信息{1}", serialPort.PortName, Encoding.Default.GetString(bt)));
  155. }
  156. // Msg.Invoke(this.DeviceName, serialPort.ReadLine());
  157. }
  158. }
  159. }
  160. }