From 6341e826a1c6fee003f8dbd707a6b06cf9a2bdb0 Mon Sep 17 00:00:00 2001 From: Mathias Yde Date: Tue, 2 Apr 2024 01:52:17 +0200 Subject: [PATCH 1/5] make buffer size configurable (windows) --- src/lib.rs | 7 +++++++ src/windows/com.rs | 7 +++++++ tests/test_buffer_size.rs | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 tests/test_buffer_size.rs diff --git a/src/lib.rs b/src/lib.rs index f369c41c..b53c9259 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -489,6 +489,9 @@ pub trait SerialPort: Send + io::Read + io::Write { /// Sets the timeout for future I/O operations. fn set_timeout(&mut self, timeout: Duration) -> Result<()>; + /// Set the buffer size + fn set_buffer_size(&mut self, receive_size: usize, transmit_size: usize) -> Result<()>; + // Functions for setting non-data control signal pins /// Sets the state of the RTS (Request To Send) control signal. @@ -677,6 +680,10 @@ impl SerialPort for &mut T { (**self).set_timeout(timeout) } + fn set_buffer_size(&mut self, receive_size: usize, transmit_size: usize) -> Result<()> { + (**self).set_buffer_size(receive_size, transmit_size) + } + fn write_request_to_send(&mut self, level: bool) -> Result<()> { (**self).write_request_to_send(level) } diff --git a/src/windows/com.rs b/src/windows/com.rs index 5573ab77..dc8be90f 100644 --- a/src/windows/com.rs +++ b/src/windows/com.rs @@ -258,6 +258,13 @@ impl SerialPort for COMPort { Ok(()) } + fn set_buffer_size(&mut self, receive_size: usize, transmit_size: usize) -> Result<()> { + match unsafe { SetupComm(self.handle, receive_size as DWORD, transmit_size as DWORD) } { + 0 => Err(super::error::last_os_error()), + _ => Ok(()), + } + } + fn write_request_to_send(&mut self, level: bool) -> Result<()> { if level { self.escape_comm_function(SETRTS) diff --git a/tests/test_buffer_size.rs b/tests/test_buffer_size.rs new file mode 100644 index 00000000..70284360 --- /dev/null +++ b/tests/test_buffer_size.rs @@ -0,0 +1,35 @@ +#![cfg(windows)] +extern crate serialport; + +#[test] +fn test_set_large_buffer() { + const STRIDE: usize = 2; + const WORDS : usize = 65536; + const BYTES: usize = WORDS * STRIDE; + + let mut tx_port = serialport::new("COM12", 9600).open().unwrap(); + let mut rx_port = serialport::new("COM13", 9600).open().unwrap(); + + tx_port.set_buffer_size(0, BYTES).unwrap(); + rx_port.set_buffer_size(BYTES, 0).unwrap(); + + let mut rx_buf = [0_u8; BYTES]; + let mut tx_buf = [0_u8; BYTES]; + + for i in 0..WORDS { + for j in 0..STRIDE { + tx_buf[i * STRIDE + j] = (i >> (j * 8) & 0xFF) as u8; + } + } + + tx_port.write_all(&tx_buf[..]).unwrap(); + rx_port.read_exact(&mut rx_buf).unwrap(); + + let transmitted = tx_buf.to_vec(); + let received = rx_buf.to_vec(); + + println!("Transmitted: {:?}", &transmitted[..8]); + println!("Received: {:?}", &received[..8]); + + assert_eq!(transmitted, received); +} From 1005bc7f6f8da6d1ee1fef3144b6c16217699f35 Mon Sep 17 00:00:00 2001 From: Mathias Yde Date: Tue, 2 Apr 2024 01:52:46 +0200 Subject: [PATCH 2/5] add dummy buffer size function in tty port --- src/posix/tty.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/posix/tty.rs b/src/posix/tty.rs index c21cf2d1..d851cd5e 100644 --- a/src/posix/tty.rs +++ b/src/posix/tty.rs @@ -675,6 +675,13 @@ impl SerialPort for TTYPort { Ok(()) } + fn set_buffer_size(&self, _rx: u32, _tx: u32) -> Result<()> { + Err(Error::new( + ErrorKind::Unsupported, + "Configurable buffer sizes are not supported on this platform", + )) + } + fn write_request_to_send(&mut self, level: bool) -> Result<()> { self.set_pin(SerialLines::REQUEST_TO_SEND, level) } From 01945eeef0ca8f8137e00377b3401bb1d5c0006d Mon Sep 17 00:00:00 2001 From: Mathias Yde Date: Wed, 10 Apr 2024 22:22:55 +0200 Subject: [PATCH 3/5] fix lint error --- tests/test_buffer_size.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_buffer_size.rs b/tests/test_buffer_size.rs index 70284360..f4cc174e 100644 --- a/tests/test_buffer_size.rs +++ b/tests/test_buffer_size.rs @@ -4,7 +4,7 @@ extern crate serialport; #[test] fn test_set_large_buffer() { const STRIDE: usize = 2; - const WORDS : usize = 65536; + const WORDS: usize = 65536; const BYTES: usize = WORDS * STRIDE; let mut tx_port = serialport::new("COM12", 9600).open().unwrap(); From ec089e8b36904b4c0236882bae8c165ae9e7e3a7 Mon Sep 17 00:00:00 2001 From: Mathias Yde Date: Wed, 10 Apr 2024 22:23:39 +0200 Subject: [PATCH 4/5] fix mutability issue for set_buffer_size for tty --- src/posix/tty.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/posix/tty.rs b/src/posix/tty.rs index d851cd5e..71f38da3 100644 --- a/src/posix/tty.rs +++ b/src/posix/tty.rs @@ -675,7 +675,7 @@ impl SerialPort for TTYPort { Ok(()) } - fn set_buffer_size(&self, _rx: u32, _tx: u32) -> Result<()> { + fn set_buffer_size(&mut self, _rx: u32, _tx: u32) -> Result<()> { Err(Error::new( ErrorKind::Unsupported, "Configurable buffer sizes are not supported on this platform", From 92d68c65a9fb363790c05730eaa4d1731c636c6b Mon Sep 17 00:00:00 2001 From: Mathias Yde Date: Thu, 11 Apr 2024 01:15:32 +0200 Subject: [PATCH 5/5] fix data type for rx and tx in set_buffer_size for tty --- src/posix/tty.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/posix/tty.rs b/src/posix/tty.rs index e97bc5ec..1925139d 100644 --- a/src/posix/tty.rs +++ b/src/posix/tty.rs @@ -675,7 +675,7 @@ impl SerialPort for TTYPort { Ok(()) } - fn set_buffer_size(&mut self, _rx: u32, _tx: u32) -> Result<()> { + fn set_buffer_size(&mut self, _rx: usize, _tx: usize) -> Result<()> { Err(Error::new( ErrorKind::Unsupported, "Configurable buffer sizes are not supported on this platform",