From 1aa1aab9c5e98b8b2fdb651fffe4b202607db0db Mon Sep 17 00:00:00 2001 From: Rob Dobson Date: Thu, 6 Jun 2024 22:43:49 +0100 Subject: [PATCH 1/2] Added support for 1.5 stop bits when reading current port settings This does not allow 1.5 stop bits to be set but avoids failure to open when the port is already set to 1.5 stop bits --- examples/hardware_check.rs | 1 + src/lib.rs | 5 +++++ src/windows/com.rs | 1 + src/windows/dcb.rs | 1 + 4 files changed, 8 insertions(+) diff --git a/examples/hardware_check.rs b/examples/hardware_check.rs index f27a0381..e9a5ca6e 100644 --- a/examples/hardware_check.rs +++ b/examples/hardware_check.rs @@ -227,6 +227,7 @@ fn test_single_port(port: &mut dyn serialport::SerialPort, loopback: bool) { // Test setting stop bits println!("Testing stop bits..."); stop_bits_check!(port, StopBits::Two); + stop_bits_check!(port, StopBits::OnePointFive); stop_bits_check!(port, StopBits::One); // Test bytes to read and write diff --git a/src/lib.rs b/src/lib.rs index 200374e8..c01aa777 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -225,6 +225,9 @@ pub enum StopBits { /// One stop bit. One, + /// One and a half stop bits. + OnePointFive, + /// Two stop bits. Two, } @@ -233,6 +236,7 @@ impl fmt::Display for StopBits { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { StopBits::One => write!(f, "One"), + StopBits::OnePointFive => write!(f, "OnePointFive"), StopBits::Two => write!(f, "Two"), } } @@ -242,6 +246,7 @@ impl From for u8 { fn from(value: StopBits) -> Self { match value { StopBits::One => 1, + StopBits::OnePointFive => 1, StopBits::Two => 2, } } diff --git a/src/windows/com.rs b/src/windows/com.rs index 5573ab77..c3ab9aad 100644 --- a/src/windows/com.rs +++ b/src/windows/com.rs @@ -326,6 +326,7 @@ impl SerialPort for COMPort { let dcb = dcb::get_dcb(self.handle)?; match dcb.StopBits { TWOSTOPBITS => Ok(StopBits::Two), + ONE5STOPBITS => Ok(StopBits::OnePointFive), ONESTOPBIT => Ok(StopBits::One), _ => Err(Error::new( ErrorKind::Unknown, diff --git a/src/windows/dcb.rs b/src/windows/dcb.rs index d0207fd6..4bb644fa 100644 --- a/src/windows/dcb.rs +++ b/src/windows/dcb.rs @@ -89,6 +89,7 @@ pub(crate) fn set_parity(dcb: &mut DCB, parity: Parity) { pub(crate) fn set_stop_bits(dcb: &mut DCB, stop_bits: StopBits) { dcb.StopBits = match stop_bits { StopBits::One => ONESTOPBIT, + StopBits::OnePointFive => ONE5STOPBITS, StopBits::Two => TWOSTOPBITS, }; } From a9f8de8fe1f240d6520dbde0516092be926152b0 Mon Sep 17 00:00:00 2001 From: Rob Dobson Date: Thu, 6 Jun 2024 23:12:15 +0100 Subject: [PATCH 2/2] Added 1.5 stop bit case for posix --- src/posix/termios.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/posix/termios.rs b/src/posix/termios.rs index f53af807..ec718d88 100644 --- a/src/posix/termios.rs +++ b/src/posix/termios.rs @@ -198,6 +198,7 @@ pub(crate) fn set_data_bits(termios: &mut Termios, data_bits: DataBits) { pub(crate) fn set_stop_bits(termios: &mut Termios, stop_bits: StopBits) { match stop_bits { StopBits::One => termios.c_cflag &= !libc::CSTOPB, + StopBits::OnePointFive => termios.c_cflag &= !libc::CSTOPB, StopBits::Two => termios.c_cflag |= libc::CSTOPB, }; }