예제 #1
0
 public void ClosePort()
 {
     if (!_port.IsOpen)
     {
         return;
     }
     _stopwatch.Stop();
     _port.Close();
     PortStatusChanged?.Invoke(false);
 }
예제 #2
0
 public void OpenPort()
 {
     if (_port.IsOpen)
     {
         return;
     }
     _port.Open();
     _startTime = DateTime.Now;
     _stopwatch = Stopwatch.StartNew();
     PortStatusChanged?.Invoke(true);
 }
예제 #3
0
        private void OnTimedEvent(object sender, ElapsedEventArgs e)
        {
            if ((_online || !IsOnline()) && (!_online || IsOnline()))
            {
                return;
            }

            _online = IsOnline();

            PortStatusChanged?.Invoke(this, new SerialPortStatusChangedEventHandlerArgs
            {
                Online = _online
            });
        }
예제 #4
0
        private void StatusTimerHandler(object state)
        {
            if (!_port.IsOpen)               //Если порт оказался закрытым
            {
                Status = EPortStatus.Closed; //Меняем статус
                if (AutoConnect)             //и надо его открывать автоматически
                {
                    string s;
                    Connect(out s); //пробуем открыть
                }
            }

            if (PortStatusChanged != null)  //Если на событие статуса кто-то подписался, то вызываем обработчик, передав ему туда текущий статус
            {
                PortStatusChanged.BeginInvoke(this, new PortStatusChangedEventArgs {
                    Status = Status
                }, null, null);
            }
        }
예제 #5
0
 public void OpenPort()
 {
     if (_port.IsOpen)
     {
         return;
     }
     _port.Open();
     _cancelRead = new CancellationTokenSource();
     _bgWorker   = new BackgroundWorker {
         WorkerSupportsCancellation = true
     };
     _bgWorker.DoWork += async(sender, e) => {
         while (!_bgWorker.CancellationPending)
         {
             await DetectPacket();
         }
         e.Cancel = true;
     };
     _startTime = DateTime.Now;
     _stopwatch = Stopwatch.StartNew();
     _bgWorker.RunWorkerAsync();
     PortStatusChanged?.Invoke(true);
 }
예제 #6
0
        public async Task ClosePort()
        {
            if (!_port.IsOpen)
            {
                return;
            }
            _bgWorker.CancelAsync();
            if (!_cancelRead.IsCancellationRequested)
            {
                _cancelRead.Cancel();
            }
            var timeout = READ_TIMEOUT;

            while (_bgWorker.IsBusy && timeout > 0)
            {
                await Task.Delay(100);

                timeout -= 100;
            }
            _stopwatch.Stop();
            _port.Close();
            Busy = false;
            PortStatusChanged?.Invoke(false);
        }