123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- namespace Universal.IO;
- public class IOSerial : BaseFilter, IDisposable
- {
- private static bool SerialPortExist(string portName)
- {
- foreach (string singlePortName in SerialPort.GetPortNames())
- {
- if (singlePortName.ToLower().Equals(portName.ToLower()))
- return true;
- }
- return false;
- }
- volatile bool _init = false;
- public string? Name { get; internal set; }
- private SerialConnection? _SerialPortConnection;
- public bool Initialize(string name)
- {
- if (_init)
- return false;
- _init = true;
- this.Name = name;
- return true;
- }
- public bool Open(string strPortName, int baudRate, Parity parity, int dataBits, StopBits stopBits, out SerialConnection? connection)
- {
- connection = null;
- if (!_init)
- return false;
- if (_SerialPortConnection is not null && _SerialPortConnection.SerialPort.IsOpen)
- return false;
- if (!SerialPortExist(strPortName))
- return false;
- if (baudRate <= 0)
- return false;
- if (dataBits < 5 || dataBits > 8)
- return false;
- SerialPort serialPort;
- SerialConnection? serialPortConnection = null;
- try
- {
- serialPort = new(strPortName, baudRate, parity, dataBits, stopBits);
- serialPort.Open();
- serialPortConnection = new(strPortName, serialPort);
- PrevConnector?.Connected(serialPortConnection!);
- }
- catch { return false; }
- serialPort.DataReceived += DataReceivedEvent;
- this._SerialPortConnection = serialPortConnection;
- connection = this._SerialPortConnection;
- return true;
- }
- void DataReceivedEvent(object sender, SerialDataReceivedEventArgs e)
- {
- DateTime receiveTime = DateTime.Now;
- if (this._SerialPortConnection is null)
- return;
- byte[] cache = new byte[this._SerialPortConnection.SerialPort.BytesToRead];
- try
- {
- this._SerialPortConnection.SerialPort.Read(cache, 0, cache.Length);
- }
- catch
- {
- //Port Closed
- }
- PrevReceiver?.Receive(new(cache, _SerialPortConnection, receiveTime));
- }
- public override bool Send(Data data)
- {
- if (!_init)
- return false;
- if (this._SerialPortConnection is null)
- return false;
- if (this._SerialPortConnection is null)
- return false;
- if (!this._SerialPortConnection.SerialPort.IsOpen)
- return false;
- if (!this._SerialPortConnection.SerialPort.DsrHolding)
- return false;
- if (data.RawData == null || data.RawData.Length == 0)
- return false;
- if (data.Connection is null)
- return false;
- if (data.Connection != this._SerialPortConnection)
- return false;
- try
- {
- this._SerialPortConnection.SerialPort.BaseStream.Write([.. data.RawData], 0, data.RawData.Length);
- this._SerialPortConnection.SerialPort.BaseStream.Flush();
- }
- catch
- {
- return false;
- }
- return true;
- }
- public bool Close()
- {
- if (!_init)
- return false;
- if (this._SerialPortConnection is not null)
- {
- if (this._SerialPortConnection.SerialPort.IsOpen)
- this._SerialPortConnection.SerialPort.Close();
- PrevConnector?.Disconnected(this._SerialPortConnection);
- }
- return true;
- }
- private bool disposedValue;
- protected virtual void Dispose(bool disposing)
- {
- if (disposedValue)
- return;
- if (disposing)
- this._SerialPortConnection = null;
- Close();
- disposedValue = true;
- }
- public void Dispose()
- {
- Dispose(disposing: true);
- GC.SuppressFinalize(this);
- }
- }
|