PackageTrack
Sign in Get early access

serialport

A cross-platform low-level serial port library.

4.9.0 18M downloads/mo #2251 most downloaded on crates.io serialport/serialport-rs

What this package is like to depend on

Last release 5 months ago

16 Mar 2026

Release timing varies

gaps range from 5 weeks to 7 months

Nearly every release is documented

notes for 33 of 33 stable releases

4 versions withdrawn

withdrawn after publishing

10 years old

37 releases · first in 2016

3 releases in the last 12 months

see the full history below

Release timeline

37 releases · Dec 2016 to Mar 2026
2017 2018 2019 2020 2021 2022 2023 2024 2025 2026
Release Pre-release Withdrawn

Releases

latest 37
  1. 4.9.0 16 Mar 2026
    Release notes

    Added

    • Add exclusive configuration option to SerialPortBuilder to control whether ports are opened with exclusive access locks. #319

    Changed

    • Enumerate serial-base subsystem on Linux without libudev support too. Some of these newly enumerated ports may show up with a different type than with libudev, but they will be finally enumerated at all. #311
    • Enable arbitrary baud rates for Linux musl targets by directly using termios2 and the corresponding ioctls TCGETS2 and TCSETS2 from nix and the libc crate. There is no support form musl for termios2 and we are directly talking to the kernel and bypassing it here. #316

    Fixed

    • Always propagate errors out of termios getter/setter implementations.
    • Wrap slave port file descriptors in TTYPort::pair in a Drop-safe OwnedFd to avoid file descriptor leaks on early returns.
    • Enable arbitrary baud rates for Linux musl targets by using the termios2 (TCGETS2/TCSETS2 + BOTHER) path now that required libc symbols are available. #316
    • Unpin dependencies with MSRV incompatible Rust version bump. This caused issues with dependency resolution for many users building with newer Rust versions. See Dependencies on how to pin them in your project when building with older Rust versions. #324 #307 #304 #300 #231
    Open source →
  2. 4.8.1 07 Oct 2025
    Release notes

    Fixed

    • Generating documentation on docs.rs. #299
    Open source →
  3. 4.8.0 07 Oct 2025
    Release notes

    Added

    • Additionally acquire an advisory lock with flock when opening a serial port. #266

    Changed

    • Switch from no longer actively maintained Windows FFI abstractions winapi to active windows-sys crate. #280
    • Output USB VID and PID in hexadecimal digits in UsbPortInfo's Debug representation. #290
    Open source →
  4. 4.7.3 25 Aug 2025
    Release notes

    Added

    • Add support for opening serial ports on windows with an absolute path. #259

    Changed

    • Revert automatically setting DTR when opening a port as the reported issues seem to outweigh the aimed benefit. #285 #251 #243 #239 #29

    Fixed

    • Fix reporting serial numbers with colons on Windows. #279 #282
    • Setting arbitrary baud rates on Linux which resulted in issues when read back on Arch recently. #281 #283
    Open source →
  5. 4.7.2 16 May 2025 withdrawn
    Release notes

    Fixed

    • Set data terminal ready (DTR) on best-effort for not failing in the situation where we can't detect whether to apply this setting reliably. #268
    Open source →
  6. 4.7.1 26 Mar 2025 withdrawn
    Release notes

    Fixed

    • Parsing serial numbers with underscore from Windows HWIDs #253
    • Enumerate Bluetooth serial devices (RFCOMM) on Linux too. #246
    Open source →
  7. 4.7.0 13 Jan 2025 withdrawn
    Release notes

    Changed

    • Enumerate ports from more subsystems on Linux without libudev. #238
    • Set data terminal ready (DTR) signal when opening a port by default and allow to customize this behavior through the builder. #239

    Fixed

    • Retry flushing data on EINTR up to the ports read/write timeout. #225
    Open source →
  8. 4.6.1 01 Dec 2024
    Release notes

    Fixed

    • Pin subdependency libc to maintain compatibility with MSRV 1.59.0. #229
    Open source →
  9. 4.6.0 22 Oct 2024
    Release notes

    Added

    • Add recommendation on how to interpret UsbPortInfo::interface_number. #219
    • Add support for retrieving USB port info on Linux without libudev. #220

    Changed

    • Switched from core-foundation-sys to core-foundation for more conveniently working with Core Foundation types for enumeration on macOS. #218
    • Refactored output from example list_ports (alignment and order) for easily comparing different runs. #220

    Fixed

    • Fix enumeration USB reported as PCI devices which do not have a (short) serial number. #160
    • Fix ignoring the status of several function calls into Core Foundation on mac OS. #218
    Open source →
  10. 4.5.1 20 Sep 2024
    Release notes

    Fixed

    • Fix ignoring errors from setting baud rate and ignoring unsupported baud rates. #213
    • Remove leftover debug output from posix::poll::wait_fd. #216
    Open source →
  11. 4.5.0 05 Aug 2024
    Release notes

    Added

    • Add IntoRawHandle implementation for COMPort #199
    • Add MODALIAS as additional source of information for USB devices on Linux #170

    Changed

    • Replace using regex crate for parsing device identification strings for available_ports on Windows. This is now done by some bespoke code to significantly reduce build times. #201
    • Switch from ANSI to Unicode/UTF-16 string API on Windows. #89

    Fixed

    • Fix looking up UsbPortInfo::interface on macOS. #193
    • Fix issues with very long timeout values like Duration::MAX by clamping to maximum supported value for underlying platform. #207, #208
    Open source →
  12. 4.4.0 27 Jun 2024
    Release notes

    Added

    • Add conversions between DataBits, StopBits types and their numeric representations.
    • Add FromStr implementation for FlowControl. #163

    Changed

    • Several changes for CI hygiene.

    Fixed

    • Fix a bug where available_ports() returned disabled devices on Windows. #144
    • Fix a bug on Windows where the WriteTotalTimeoutConstant field hasn't been configured properly when the set_timeout method is called. #124
    • Fix a longstanding bug on Windows where timeouts of length zero (Duration::ZERO) actually resulted in waiting indefinitely. #79
    • Fix missing modem ports from available_ports() on Windows. #81 #84
    • Fix MSRV incompatibility with sub-dependency of clap. #186
    Open source →
  13. 4.3.0 12 Dec 2023
    Release notes

    Changed

    • Raise MSRV from 1.56.1 to 1.59.0 and Rust edition from 2018 to 2021. #137
    • Update bitflags dependency to 2.4.0. #127
    • Open serial devices with O_CLOEXEC (Posix). This will close the device handles when starting a child process. In particular this means that a serial device can be reopened after making SW update of a Tauri application. #130
    • Prefer USB device manufacturer and model information from the actual USB device over the information from udev's database. #137

    Fixed

    • Fixes a bug on Windows where composite devices would show a incorrect serial number. #141
    • Fixes a bug on Linux without udev where available_ports() returned wrong device file paths. #122
    • Fixes a bug on Windows where some USB device serial numbers were truncated. #131
    • Switches to maintained sys crates for CoreFoundation and IOKit on macOS. #112, #136
    Open source →
  14. 4.2.2 05 Aug 2023
    Release notes

    Fixed

    • Fixes a bug on the Raspberry Pi 4, which results in USB-devices being detected as PCI-devices. #113
    Open source →
  15. 4.2.1 22 May 2023
    Release notes

    Added

    • Add support for reporting the USB device interface (feature-gated by usbserialinfo-interface). #47, #101
    • Add example for loopback testing with real hardware. #69
    • Implement fmt::Debug and fmt::Display for SerialPort and related enums. #91

    Changed

    • Migrated from unmaintainted dependency mach to mach2.
    • Update dependency nix from 0.24.1 to 0.26.0 and raise MSRV to 1.56.1. #67, #75, #78

    Fixed

    • Skip attempts to set baud rate 0 on macOS. #58
    • Fix getting actual result value from tiocmget. #61
    • Fix serial number retrieval procedure on macOS. #65
    • Fix port name retrieval procedure for Unicode names on Windows. #63
    • Fix compilation for OpenBSD due to missing use declaration. #68
    • A number of memory leaks have been addressed when using serialport-rs. #98
    Open source →
  16. 4.2.0 02 Jun 2022 withdrawn
    Release notes

    Added

    • Add serde support behind a feature flag. #51

    Changed

    • Request exclusive access when opening a POSIX serial port by default. #44
    • Updated nix dependency to 0.24.1 and limited features. #46
    • Derive the Clone trait for Error. #53
    • Enumerate callout devices in addition to dial-in devices on macOS. #54
    • Revert to edition 2018 to allow for use with older compiler versions.

    Fixed

    • Set port timeout to a non-zero value before performing loopback test. #45
    Open source →
  17. 4.1.0 04 Apr 2022
    Release notes

    Added

    • impl SerialPort for &mut T. This allows a &mut T (where T: SerialPort) to be used in a context where impl SerialPort is expected. !114

    Changed

    • Updated nix dependency to 0.23.1.
    • Remove useless call to tcflush on open. #40

    Fixed

    • Improved support for recent versions of macOS. !104
    • Fix filehandle leak in open() on Windows. #36
    • Make sure fd is properly closed if initialization fails. #39 #41
    Open source →
  18. 4.0.1 17 Apr 2021
    Release notes

    Changed

    • Update maintenance status to looking for a new maintainer.

    Fixed

    • Properly initialize DCB structure on Windows. This fixes some non-functional devices. !97
    Open source →
  19. 4.0.0 18 Dec 2020
    Release notes

    Added

    • Added send_break() to TTYPort. !69
    • Enable available_ports() for Linux musl targets and those without the libudev feature enabled by scanning /sys/ for ports. !72
    • ENOENT and EACCES errors are now exposed as NotFound and PermissionDenied errors on Linux. !80
    • try_clone_native() was added to COMPort and TTYPort to complement SerialPort::try_clone() but returning the concrete type instead. !85
    • Added set_break() and clear_break() to SerialPort. !70

    Changed

    • Minimum supported Rust version is now 1.36.0 to support the mem::MaybeUninit feature.
    • The platform-specific TTYPort/BreakDuration and COMPort are now at the root level rather than under the posix and windows submodules respectively.
    • Opening SerialPort s now uses the builder pattern through serialport::new(). See the README for concrete examples. !73
    • SerialPortss are no longer opened with a default timeout of 1ms.
    • Under linux, the manufacturer and product fields of UsbPortInfo now take their values from the ID_VENDOR_FROM_DATABASE and ID_MODEL_FROM_DATABASE udev properties respectively, instead of the ID_VENDOR and ID_MODEL properties that were used before. When the _FROM_DATABASE values are not available, it falls back to the old behavior. !86
    • POSIX ports are no longer opened in exclusive mode. After opening they can be made exclusive via TTYPort::set_exclusive(). !98

    Fixed

    • Raised the version specification for bitflags to 1.0.4. Previously it was set to 1.0.0, but this version of bitflags is actually incompatible with Rust 2018 style macro imports that serialport-rs requires. !83

    Removed

    • Removed the serialport::prelude module. Types should be explicitly imported or can be glob-imported from the root like use serialport::*. !82
    Open source →
  20. 3.3.0 13 Jun 2019
    Release notes

    Added

    • Added support for arbitrary baud rates on macOS and iOS.

    Changed

    • Minimum supported Rust version is now 1.31 to support using the 2018 edition of Rust.

    Fixed

    • Upgraded sparc64-unknown-linux-gnu to Tier 2 support.
    Open source →
  21. 3.2.0 02 Jan 2019
    Release notes

    Added

    • Port enumeration is now supported on FreeBSD.

    Changed

    • Minimum supported Rust version changed to 1.24.1.
    • Made aarch64-unknown-linux-musl a Tier-2 supported target.

    Fixed

    • Fixed software flow control for POSIX systems. !54

    Removed

    • Removed support for x86_64-unknown-linux-gnux32.
    Open source →
  22. 3.1.0 02 Nov 2018
    Release notes

    Added

    • Added bytes_to_read(), bytes_to_write(), and clear() to SerialPort. Also added example scripts for using them.
    • Added Tier 2 support for:
      • armv5te-unknown-linux-musleabi
    • Added "libudev" feature to allow for disabling linking to libudev on Linux.
    Open source →
  23. 3.0.0 15 Jul 2018
    Release notes

    Added

    • Arbitrary baud rates are now supported on BSDs, Linux, and Windows.
    • Added Tier 1 support for {i586|i686|x86_64}-unknown-linux-musl.
    • Added Tier 2 support for:
      • {arm|armv7}-linux-androideabi
      • i686-linux-android
      • {i686|x86_64}-unknown-freebsd
      • arm-unknown-linux-musleabi
      • armv7-unknown-linux-musleabihf
      • {mips64|mips64el}-unknown-linux-gnuabi64
      • armv5te-unknown-linux-gnueabi
      • {aarch64|mips|mipsel|powerpc64|powerpc64le|powerpc|s390x}-unknown-linux-gnu
      • {mips|mipsel}-unknown-linux-musl
      • x86_64-unknown-netbsd
    • Added Tier 3 support for:
      • {aarch64|x86_64}-linux-android
      • aarch64-unknown-linux-musl
      • sparc64-unknown-linux-gnu,
      • x86_64-unknown-linux-gnux32

    Changed

    • Most port configuration methods now return a Result<()>.
    • Renamed SerialPort::port_name() to name().

    Fixed

    • On Windows, the port_name field on SerialPortInfo included an extraneous trailing nul byte character.

    Removed

    • The BaudRate enum was removed in favor of a u32.
    Open source →
  24. 2.3.0 14 Mar 2018
    Release notes

    Added

    • Added examples/hardware_check.rs for use in debugging library or driver issues when using physical serial ports.
    • Added SerialPort::try_clone which allows for cloning a port for full-duplex reading and writing.

    Changed

    • Removed configuration caching for serial ports. The underlying implementations for all platforms cached a configuration struct so that modifying the port settings involved a single switch into kernel space. This has been removed so now two system calls are needed for every configuration change. This is probably a slight performance regression, but should allow the new SerialPort::try_clone interface to work as people expect.

    Fixed

    • TTYPort::into_raw_fd will now work as expected. It previously closed the port so the returned file descriptor would be invalid.
    • 921600 baud is now supported on NetBSD and FreeBSD.
    Open source →
  25. 2.1.0 15 Feb 2018
    Release notes

    Added

    • impl FromRawHandle for COMPort.

    Changed

    • Specific IO-related errors are now returned instead of mapping every IO error to Unknown. This makes it possible to catch things like time-out errors.
    • Changed all baud rates to be reported as the discrete BaudRate::Baud* types rather than as the BaudRate::BaudOther(*) type.

    Fixed

    • Modem-type USB serial devices are now enumerated on macOS. This now allows connected Arduinos to be detected.
    • Compilation on FreeBSD and NetBSD was fixed by removing the 921600 baud rates. These will be re-added in a future release.
    Open source →
  26. 2.0.0 19 Dec 2017
    Release notes

    Added

    • USB device information is now returned in calls to available_ports().
    • Serial port enumeration is now supported on Mac.
    • Serial port enumeration now attempts to return the interface used for the port (USB, PCI, Bluetooth, Unknown).
    • BaudRate::standard_rates() provides a vector of cross-platform baud rates.
    • SerialPort trait is now Send.

    Changed

    • Software license has changed from LGPLv3+ to MPL-2.0. This makes it possible to use this library in any Rust project if it's unmodified.
    • Mac is now a Tier 2 supported platform.
    • Removed BaudRate::from_speed(usize) and BaudRate::speed -> usize in favor of the From<u32> and Into<u32> traits.
    • Removed available_baud_rates in favor of BaudRate::platform_rates() as this has a more clear semantic meaning. The returned list of baud rates is now also correct for all supported platforms.
    • Removed termios dependency in favor of nix. This is a big step towards supporting additional platforms.

    Fixed

    • Stop bits are now specified properly (had been reversed). Thanks to @serviushack. (MR#9)
    • TTYPort::pair() is now thread-safe.
    • TTYPort::open() no longer leaks file descriptors if it errors. Thanks to @daniel. (MR#12)
    • Fixed compilation when targeting Android.
    Open source →
  27. 1.0.1 21 Feb 2017
    Release notes

    Fixed

    • read() now properly blocks for at least one character.
    • Compilation now works on Mac.
    Open source →
  28. 1.0.0 14 Feb 2017
    Release notes

    Changed

    • Various documentation/README updates.
    • Minor formatting fixes (from rustfmt).

    Fixed

    • Platform-specific examples are now only built on appropriate platforms.
    Open source →
  29. 0.9.0 09 Feb 2017
    Release notes

    Added

    • impl Debug for COMPort.
    • exclusive() and set_exclusive() for TTYPort.
    • port_name() for SerialPort.
    • impl FromRawFd and impl IntoRawFd for TTYPort.
    • pair() for TTYPort.
    Open source →
  30. 0.3.0 28 Jan 2017
    Release notes

    Added

    • open_with_settings() to support initializing the port with custom settings.
    • SerialPortSettings is now publically usable being exported in the prelude, having all public and commented fields, and a Default impl.

    Changed

    • TTYPort/COMPort::open() now take a SerialPortSettings argument and return concrete types.
    • serialport::open() now initializes the port to reasonable defaults.
    • Removed all instances of try!() for ?.
    • SerialPort::set_all() now borrows SerialPortSettings.
    Open source →
  31. 0.2.4 26 Jan 2017
    Release notes

    Added

    • Report an Unimplemented error for unsupported unix targets.

    Changed

    • Minor changes suggested by Clippy.
    • Reworked Cargo.toml to more easily support additional targets.

    Fixed

    • AppVeyor badge should now be properly displayed.
    Open source →
  32. 0.2.3 21 Jan 2017
    Release notes

    Added

    • Specify AppVeyor build status badge for crates.io.
    Open source →
  33. 0.2.2 21 Jan 2017
    Release notes
    • No changes, purely a version increment to push new crate metadata to crates.io.
    Open source →
  34. 0.2.1 21 Jan 2017
    Release notes

    Added

    • Specify category for crates.io.
    Open source →
  35. 0.2.0 07 Jan 2017
    Release notes

    Added

    • Added a changelog.
    • Added a getter/setter pair for all settings at once.
    • An error is thrown if settings weren't correctly applied on POSIX.
    Open source →
  36. 0.1.1 24 Dec 2016
    Release notes

    Changed

    • Fixed compilation on x86_64-pc-windows-gnu target.
    • Added contributors to README.
    • Clarified license terms in the README.
    Open source →
  37. 0.1.0 23 Dec 2016
    Release notes

    Added

    • Initial release.
    Open source →

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive