diff --git a/src/lib.rs b/src/lib.rs index f01363dc..c1a747c6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -487,6 +487,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. @@ -675,6 +678,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/posix/tty.rs b/src/posix/tty.rs index e29a8a85..1925139d 100644 --- a/src/posix/tty.rs +++ b/src/posix/tty.rs @@ -675,6 +675,13 @@ impl SerialPort for TTYPort { Ok(()) } + 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", + )) + } + fn write_request_to_send(&mut self, level: bool) -> Result<()> { self.set_pin(SerialLines::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..f4cc174e --- /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); +}