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); } }
/// <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)); }
private void Write(byte[] bytes) { try { _serialPort.DiscardInBuffer(); _serialPort.DiscardOutBuffer(); _serialPort.Write(bytes, 0, bytes.Length); } catch (Exception e) { throw new TransmissionException(e); } }
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(); }
/// <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(); } }
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(); }
/// <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)); }
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; } }
public void DiscardOutBuffer() { _logged.DiscardOutBuffer(); _log.LogTrace("Out buffer discarded"); }