1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- using System;
- using System.IO.Ports;
- using System.Threading;
- using Vinno.IUS.Common.Log;
- namespace Vinno.FIS.Sonopost.Features.Oled
- {
- public class Comm
- {
- private const int Timeout = 50; //50ms
- private SerialPort _serialPort;
- private AutoResetEvent _receiveNow;
- public Comm(string portName)
- {
- _receiveNow = new AutoResetEvent(false);
- _serialPort = new SerialPort(portName)
- {
- BaudRate = 9600,
- DataBits = 8,
- StopBits = StopBits.One,
- Parity = Parity.Even,
- ReadTimeout = 100,
- WriteTimeout = -1
- };
- }
- /// <summary>
- /// Open port
- /// </summary>
- /// <returns>Open success or not.</returns>
- public bool OpenPort()
- {
- if (!_serialPort.IsOpen)
- {
- _serialPort.Open();
- _serialPort.ReadTimeout = Timeout;
- _serialPort.WriteTimeout = Timeout;
- _serialPort.DataReceived += OnDataReceived;
- }
- return _serialPort.IsOpen;
- }
- /// <summary>
- /// Close port
- /// </summary>
- public void ClosePort()
- {
- if (_serialPort.IsOpen)
- {
- _serialPort.DataReceived -= OnDataReceived;
- _serialPort.Close();
- }
- }
- /// <summary>
- /// Write buffer
- /// </summary>
- /// <param name="send">buffer</param>
- /// <returns>Receive result</returns>
- public IReceiveResult Write(byte[] send)
- {
- _serialPort.DiscardOutBuffer();
- _serialPort.DiscardInBuffer();
- _receiveNow.Reset();
- try
- {
- _serialPort.Write(send, 0, send.Length);
- if (_receiveNow.WaitOne(500))
- {
- var countToRead = _serialPort.BytesToRead;
- if (countToRead > 0)
- {
- var buffer = new byte[countToRead];
- _serialPort.Read(buffer, 0, countToRead);
- return MessageReceiver.Parse(buffer, send[1]);
- }
- }
- }
- catch (Exception e)
- {
- Logger.WriteLineError($"Write data Error:{e}");
- }
- return MessageReceiver.CommonError;
- }
- private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
- {
- if (e.EventType == SerialData.Chars)
- {
- // Logger.WriteLineInfo("Data received");
- _receiveNow.Set();
- }
- }
- }
- }
|