Comm.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System;
  2. using System.IO.Ports;
  3. using System.Threading;
  4. using Vinno.IUS.Common.Log;
  5. namespace Vinno.FIS.Sonopost.Features.Oled
  6. {
  7. public class Comm
  8. {
  9. private const int Timeout = 50; //50ms
  10. private SerialPort _serialPort;
  11. private AutoResetEvent _receiveNow;
  12. public Comm(string portName)
  13. {
  14. _receiveNow = new AutoResetEvent(false);
  15. _serialPort = new SerialPort(portName)
  16. {
  17. BaudRate = 9600,
  18. DataBits = 8,
  19. StopBits = StopBits.One,
  20. Parity = Parity.Even,
  21. ReadTimeout = 100,
  22. WriteTimeout = -1
  23. };
  24. }
  25. /// <summary>
  26. /// Open port
  27. /// </summary>
  28. /// <returns>Open success or not.</returns>
  29. public bool OpenPort()
  30. {
  31. if (!_serialPort.IsOpen)
  32. {
  33. _serialPort.Open();
  34. _serialPort.ReadTimeout = Timeout;
  35. _serialPort.WriteTimeout = Timeout;
  36. _serialPort.DataReceived += OnDataReceived;
  37. }
  38. return _serialPort.IsOpen;
  39. }
  40. /// <summary>
  41. /// Close port
  42. /// </summary>
  43. public void ClosePort()
  44. {
  45. if (_serialPort.IsOpen)
  46. {
  47. _serialPort.DataReceived -= OnDataReceived;
  48. _serialPort.Close();
  49. }
  50. }
  51. /// <summary>
  52. /// Write buffer
  53. /// </summary>
  54. /// <param name="send">buffer</param>
  55. /// <returns>Receive result</returns>
  56. public IReceiveResult Write(byte[] send)
  57. {
  58. _serialPort.DiscardOutBuffer();
  59. _serialPort.DiscardInBuffer();
  60. _receiveNow.Reset();
  61. try
  62. {
  63. _serialPort.Write(send, 0, send.Length);
  64. if (_receiveNow.WaitOne(500))
  65. {
  66. var countToRead = _serialPort.BytesToRead;
  67. if (countToRead > 0)
  68. {
  69. var buffer = new byte[countToRead];
  70. _serialPort.Read(buffer, 0, countToRead);
  71. return MessageReceiver.Parse(buffer, send[1]);
  72. }
  73. }
  74. }
  75. catch (Exception e)
  76. {
  77. Logger.WriteLineError($"Write data Error:{e}");
  78. }
  79. return MessageReceiver.CommonError;
  80. }
  81. private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
  82. {
  83. if (e.EventType == SerialData.Chars)
  84. {
  85. // Logger.WriteLineInfo("Data received");
  86. _receiveNow.Set();
  87. }
  88. }
  89. }
  90. }