private void CloseSerialPortConnection()
 {
     lock (_serialPortLock)
     {
         if (_serialPort != null)
         {
             try
             {
                 if (_serialPort.IsOpen)
                 {
                     _log.DebugFormat($"Closing serial port {_config.COMPort}");
                     _serialPort.DiscardOutBuffer();
                     _serialPort.Close();
                 }
                 GC.ReRegisterForFinalize(_serialPort.BaseStream);
                 _serialPort.Dispose();
             }
             catch (Exception e)
             {
                 _log.Error(e.Message, e);
             }
             _serialPort = null;
         }
         _unsuccessfulConnectionAttempts = 0; //reset unsuccessful connection attempts counter
     }
 }
 private bool EnsureSerialPortConnected()
 {
     lock (_serialPortLock)
     {
         if (_serialPort == null)
         {
             try
             {
                 _serialPort = new SerialPort(_config.COMPort, BAUD_RATE, PARITY, DATA_BITS, STOP_BITS);
             }
             catch (Exception e)
             {
                 _log.Error(e.Message, e);
                 return(false);
             }
         }
         if (_serialPort != null && !_serialPort.IsOpen &&
             _unsuccessfulConnectionAttempts < MAX_UNSUCCESSFUL_PORT_OPEN_ATTEMPTS)
         {
             try
             {
                 _serialPort.Handshake       = HANDSHAKE;
                 _serialPort.WriteTimeout    = SERIAL_WRITE_TIMEOUT;
                 _serialPort.ErrorReceived  += _serialPort_ErrorReceived;
                 _serialPort.WriteBufferSize = WRITE_BUFFER_SIZE;
                 _log.DebugFormat(
                     $"Opening serial port {_config.COMPort}: Handshake:{HANDSHAKE}, WriteTimeout:{SERIAL_WRITE_TIMEOUT}, WriteBufferSize:{WRITE_BUFFER_SIZE}");
                 _serialPort.Open();
                 GC.SuppressFinalize(_serialPort.BaseStream);
                 _serialPort.DiscardOutBuffer();
                 _unsuccessfulConnectionAttempts = 0;
                 return(true);
             }
             catch (Exception e)
             {
                 _unsuccessfulConnectionAttempts++;
                 _log.Error(e.Message, e);
             }
         }
         else if (_serialPort != null && _serialPort.IsOpen)
         {
             return(true);
         }
         return(false);
     }
 }
Beispiel #3
0
        /// <summary>
        /// Connect to the Arduino serial port
        /// </summary>
        /// <param name="portName">e.g. Com1</param>
        public async Task ConnectAsync(string portName)
        {
            await Task.Delay(0); // avoid CS1998

            Logger?.LogTrace($@"Connect: {portName}");

            // Create a new SerialPort object with default settings.
            Aborted = false;

            SetupCom(portName);

            _serialPortCancellationTokenSource = new CancellationTokenSource();

            _serialPort.Open();

            _readThread  = new Thread(Read);
            _writeThread = new Thread(Write);

            _readThread.Start();
            _writeThread.Start();

            // we need Dtr if not used as Reset
            // otherwise reset if dtr is set
            if (!DtrIsReset || ResetOnConnect)
            {
                _serialPort.DtrEnable = true;
            }
            else
            {
                _serialPort.DiscardOutBuffer();
                _serialPort.WriteLine("");
            }

            // _serialPort.DtrEnable = true;
            _serialPort.RtsEnable = true;

            bool wasEmpty;

            lock (_pendingCommands)
            {
                wasEmpty = _pendingCommands.Count == 0;
                _pendingCommands.Clear();
            }

            lock (_commands)
            {
                _commands.Clear();
            }

            if (!wasEmpty)
            {
                OnCommandQueueChanged(new SerialEventArgs(0, null));
            }

            OnCommandQueueEmpty(new SerialEventArgs(0, null));
        }
Beispiel #4
0
 private void Write(byte[] bytes)
 {
     try
     {
         _serialPort.DiscardInBuffer();
         _serialPort.DiscardOutBuffer();
         _serialPort.Write(bytes, 0, bytes.Length);
     }
     catch (Exception e)
     {
         throw new TransmissionException(e);
     }
 }
Beispiel #5
0
        private void ConfigurePort(ISerialPort serialPort)
        {
            serialPort.BaudRate = BAUD_RATE;
            serialPort.NewLine  = NEWLINE;
            serialPort.StopBits = STOP_BITS;
            serialPort.DataBits = DATA_BITS;
            serialPort.Parity   = PARITY;

            serialPort.Handshake    = HAND_SHAKE;
            serialPort.ReadTimeout  = READ_TIMEOUT;
            serialPort.WriteTimeout = WRITE_TIMEOUT;

            serialPort.Open();
            serialPort.DiscardInBuffer();
            serialPort.DiscardOutBuffer();
        }
Beispiel #6
0
        /// <remarks>The port must be open before the call</remarks>
        public async Task <byte[]> ReadAsync(CancellationToken cancellationToken)
        {
            var received     = new List <byte>();
            var captureBegan = false;
            var captureEnd   = false;

            try
            {
                // ReSharper disable once LoopVariableIsNeverChangedInsideLoop
                while (!captureEnd)
                {
                    await Task.Run(() =>
                    {
                        var nextByte = _serialPort.ReadByte();

                        if (nextByte == -1)
                        {
                            captureEnd = true;
                            return;
                        }
                        if (nextByte == _packetBeginning)
                        {
                            captureBegan = true;
                        }
                        if (nextByte == _packetEnd && captureBegan)
                        {
                            captureEnd = true;
                        }

                        received.Add(Convert.ToByte(nextByte));
                    }, cancellationToken);
                }

                return(received.ToArray());
            }
            catch (Exception e)
            {
                throw new ReceptionException(e, received.ToArray());
            }
            finally
            {
                _serialPort.DiscardInBuffer();
                _serialPort.DiscardOutBuffer();
            }
        }
Beispiel #7
0
        private void ConfigurePortForDiscovery(ISerialPort serialPort)
        {
            serialPort.ReadBufferSize  = READ_BUFFER_SIZE;
            serialPort.WriteBufferSize = WRITE_BUFFER_SIZE;

            serialPort.BaudRate = BAUD_RATE;
            serialPort.NewLine  = NEWLINE;
            serialPort.StopBits = STOP_BITS;
            serialPort.DataBits = DATA_BITS;
            serialPort.Parity   = PARITY;

            //Not sure why the following three are differnet during discovery.
            serialPort.Handshake    = Handshake.RequestToSendXOnXOff; //Because it works for either K24 or WK43
            serialPort.ReadTimeout  = 1000;
            serialPort.WriteTimeout = 1000;

            serialPort.Open();
            serialPort.DiscardInBuffer();
            serialPort.DiscardOutBuffer();
        }
Beispiel #8
0
        /// <summary>
        /// Connect to the Arduino serial port
        /// </summary>
        /// <param name="portname">e.g. Com1</param>
        public async Task ConnectAsync(string portname)
        {
            // Create a new SerialPort object with default settings.
            Aborted = false;

            SetupCom(portname);

            _serialPortCancellationTokenSource = new CancellationTokenSource();
            _serialPort.Open();

            _readThread  = new Thread(Read);
            _writeThread = new Thread(Write);

            _readThread.Start();
            _writeThread.Start();

            if (!ResetOnConnect)
            {
                _serialPort.DiscardOutBuffer();
                _serialPort.WriteLine("");
            }

            bool wasempty;

            lock (_pendingCommands)
            {
                wasempty = _pendingCommands.Count == 0;
                _pendingCommands.Clear();
            }
            lock (_commands)
            {
                _commands.Clear();
            }

            if (!wasempty)
            {
                OnComandQueueChanged(new SerialEventArgs(0, null));
            }

            OnComandQueueEmpty(new SerialEventArgs(0, null));
        }
Beispiel #9
0
        public string ExecCommand(ISerialPort port, string command, int responseTimeout, string errorMessage)
        {
            try
            {
                port.DiscardOutBuffer();
                port.DiscardInBuffer();
                _receiveNow.Reset();
                port.Write(command + "\r");

                string input = ReadResponse(port, responseTimeout);
                if ((input.Length == 0) || ((!input.EndsWith("\r\n> ")) && (!input.EndsWith("\r\nOK\r\n"))))
                {
                    throw new ApplicationException("No success message was received.");
                }
                return(input);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Beispiel #10
0
 public void DiscardOutBuffer()
 {
     _logged.DiscardOutBuffer();
     _log.LogTrace("Out buffer discarded");
 }