using Windows.Win32; using Windows.Win32.Devices.Communication; using Nefarius.Peripherals.SerialPort.Win32PInvoke; namespace Nefarius.Peripherals.SerialPort; public partial class SerialPort { /// /// If true, the port will automatically re-open on next send if it was previously closed due /// to an error (default: false) /// public bool AutoReopen { get; set; } /// /// Baud Rate (default: 115200) /// /// Unsupported rates will throw "Bad settings". public int BaudRate { get; set; } = 115200; /// /// If true, subsequent Send commands wait for completion of earlier ones enabling the results /// to be checked. If false, errors, including timeouts, may not be detected, but performance /// may be better. /// public bool CheckAllSends { get; set; } = true; /// /// Number of databits 1..8 (default: 8) unsupported values will throw "Bad settings" /// public int DataBits { get; set; } = 8; /// /// The parity checking scheme (default: none) /// public Parity Parity { get; set; } = Parity.None; /// /// If true, Xon and Xoff characters are sent to control the data flow from the remote station (default: false) /// public bool RxFlowX { get; set; } /// /// If true, received characters are ignored unless DSR is asserted by the remote station (default: false) /// public bool RxGateDsr { get; set; } /// /// The number of free bytes in the reception queue at which flow is disabled (default: 2048) /// public int RxHighWater { get; set; } = 2048; /// /// The number of bytes in the reception queue at which flow is re-enabled (default: 512) /// public int RxLowWater { get; set; } = 512; /// /// Requested size for receive queue (default: 0 = use operating system default) /// public int RxQueue { get; set; } /// /// Constant. Max time for Send in ms = (Multiplier * Characters) + Constant (default: 0) /// public int SendTimeoutConstant { get; set; } /// /// Multiplier. Max time for Send in ms = (Multiplier * Characters) + Constant /// (default: 0 = No timeout) /// public int SendTimeoutMultiplier { get; set; } /// /// Number of stop bits (default: one) /// public StopBits StopBits { get; set; } = StopBits.One; /// /// If true, transmission is halted unless CTS is asserted by the remote station (default: false) /// public bool TxFlowCts { get; set; } /// /// If true, transmission is halted unless DSR is asserted by the remote station (default: false) /// public bool TxFlowDsr { get; set; } /// /// If true, transmission is halted when Xoff is received and restarted when Xon is received (default: false) /// public bool TxFlowX { get; set; } /// /// Requested size for transmit queue (default: 0 = use operating system default) /// public int TxQueue { get; set; } /// /// If false, transmission is suspended when this station has sent Xoff to the remote station (default: true) /// Set false if the remote station treats any character as an Xon. /// public bool TxWhenRxXoff { get; set; } = true; /// /// Specidies the use to which the DTR output is put (default: none) /// public HsOutput UseDtr { get; set; } = HsOutput.None; /// /// Specifies the use to which the RTS output is put (default: none) /// public HsOutput UseRts { get; set; } = HsOutput.None; /// /// The character used to signal Xoff for X flow control (default: DC3) /// public ASCII XoffChar { get; set; } = ASCII.DC3; /// /// The character used to signal Xon for X flow control (default: DC1) /// public ASCII XonChar { get; set; } = ASCII.DC1; /// /// True if online. /// public bool Online => _online && CheckOnline(); /// /// True if the RTS pin is controllable via the RTS property /// protected bool RtSavailable => _stateRts < 2; /// /// Set the state of the RTS modem control output /// protected bool Rts { set { if (_stateRts > 1) return; CheckOnline(); if (value) { if (PInvoke.EscapeCommFunction(_hPort, ESCAPE_COMM_FUNCTION.SETRTS)) _stateRts = 1; else ThrowException("Unexpected Failure"); } else { if (PInvoke.EscapeCommFunction(_hPort, ESCAPE_COMM_FUNCTION.CLRRTS)) _stateRts = 1; else ThrowException("Unexpected Failure"); } } get => _stateRts == 1; } /// /// True if the DTR pin is controllable via the DTR property /// protected bool DtrAvailable => _stateDtr < 2; /// /// The state of the DTR modem control output /// protected bool Dtr { set { if (_stateDtr > 1) return; CheckOnline(); if (value) { if (PInvoke.EscapeCommFunction(_hPort, ESCAPE_COMM_FUNCTION.SETDTR)) _stateDtr = 1; else ThrowException("Unexpected Failure"); } else { if (PInvoke.EscapeCommFunction(_hPort, ESCAPE_COMM_FUNCTION.CLRDTR)) _stateDtr = 0; else ThrowException("Unexpected Failure"); } } get => _stateDtr == 1; } /// /// Assert or remove a break condition from the transmission line /// protected bool Break { set { if (_stateBrk > 1) return; CheckOnline(); if (value) { if (PInvoke.EscapeCommFunction(_hPort, ESCAPE_COMM_FUNCTION.SETBREAK)) _stateBrk = 0; else ThrowException("Unexpected Failure"); } else { if (PInvoke.EscapeCommFunction(_hPort, ESCAPE_COMM_FUNCTION.CLRBREAK)) _stateBrk = 0; else ThrowException("Unexpected Failure"); } } get => _stateBrk == 1; } /// /// Port Name /// public string PortName { get; set; } public Handshake Handshake { get => _handShake; set { _handShake = value; switch (_handShake) { case Handshake.None: TxFlowCts = false; TxFlowDsr = false; TxFlowX = false; RxFlowX = false; UseRts = HsOutput.Online; UseDtr = HsOutput.Online; TxWhenRxXoff = true; RxGateDsr = false; break; case Handshake.XonXoff: TxFlowCts = false; TxFlowDsr = false; TxFlowX = true; RxFlowX = true; UseRts = HsOutput.Online; UseDtr = HsOutput.Online; TxWhenRxXoff = true; RxGateDsr = false; XonChar = ASCII.DC1; XoffChar = ASCII.DC3; break; case Handshake.CtsRts: TxFlowCts = true; TxFlowDsr = false; TxFlowX = false; RxFlowX = false; UseRts = HsOutput.Handshake; UseDtr = HsOutput.Online; TxWhenRxXoff = true; RxGateDsr = false; break; case Handshake.DsrDtr: TxFlowCts = false; TxFlowDsr = true; TxFlowX = false; RxFlowX = false; UseRts = HsOutput.Online; UseDtr = HsOutput.Handshake; TxWhenRxXoff = true; RxGateDsr = false; break; } } } }