serialport 4.0.0

A cross-platform low-level serial port library
Documentation
# Change log

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [UNRELEASED]
### Added
### Changed
### Fixed
### Removed

## [4.0.0] - 2020-12-17
### Added
* Added `send_break()` to `TTYPort`
  [!69]https://gitlab.com/susurrus/serialport-rs/merge_requests/69
* Enable `available_ports()` for Linux musl targets and those without the `libudev`
  feature enabled by scanning `/sys/` for ports.
  [!72]https://gitlab.com/susurrus/serialport-rs/merge_requests/72
* `ENOENT` and `EACCES` errors are now exposed as `NotFound` and `PermissionDenied` errors on Linux
  [!80]https://gitlab.com/susurrus/serialport-rs/merge_requests/80
* `try_clone_native()` was added to `COMPort` and `TTYPort` to complement `SerialPort::try_clone()`
  but returning the concrete type instead.
  [!85]https://gitlab.com/susurrus/serialport-rs/merge_requests/85
* Added `set_break()` and `clear_break()` to `SerialPort`
  [!70]https://gitlab.com/susurrus/serialport-rs/merge_requests/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]https://gitlab.com/susurrus/serialport-rs/merge_requests/73
* `SerialPorts` s 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]https://gitlab.com/susurrus/serialport-rs/merge_requests/86
* POSIX ports are no longer opened in exclusive mode. After opening they can be made exclusive via
  `TTYPort::set_exclusive()`.
  [!98]https://gitlab.com/susurrus/serialport-rs/merge_requests/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]https://gitlab.com/susurrus/serialport-rs/merge_requests/83

### Removed
* Removed the `serialport::prelude` module. Types should be explicitly imported
  or can be glob-imported from the root like `use serialport::*`.
  [!82]https://gitlab.com/susurrus/serialport-rs/merge_requests/82

## [3.3.0] - 2019-06-12
### Added
* Added support for arbitrary baud rates on Mac OS X 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

### Removed

## [3.2.0] - 2019-01-01
### 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]https://gitlab.com/susurrus/serialport-rs/merge_requests/54)

### Removed
* Removed support for `x86_64-unknown-linux-gnux32`.

## [3.1.0] - 2018-11-02
### 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.

## [3.0.0] - 2018-07-14
### 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`.

## [2.3.0] - 2018-03-13
### 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.

## 2.2.0 - 2018-03-13
Unreleased, happened due to a user error using `cargo-release`

## [2.1.0] - 2018-02-14
### 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 OS X. 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.

## [2.0.0] - 2017-12-18
### 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

## [1.0.1] - 2017-02-20
### Fixed
* `read()` now properly blocks for at least one character
* Compilation now works on Mac

## [1.0.0] - 2017-02-13
### Changed
* Various documentation/README updates
* Minor formatting fixes (from rustfmt)

### Fixed
* Platform-specific examples are now only built on appropriate platforms

## [0.9.0] - 2017-02-09
### 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`

## [0.3.0] - 2017-01-28
### 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`

## [0.2.4] - 2017-01-26
### 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

## [0.2.3] - 2017-01-21
### Added
* Specify AppVeyor build status badge for crates.io

## [0.2.2] - 2017-01-21
* No changes, purely a version increment to push new crate metadata to crates.io

## [0.2.1] - 2017-01-21
### Added
* Specify category for crates.io

## [0.2.0] - 2017-01-07
### 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

## [0.1.1] - 2016-12-23
### Changed
* Fixed compilation on x86_64-pc-windows-gnu target
* Added contributors to README
* Clarified license terms in the README

## [0.1.0] - 2016-12-22
### Added
* Initial release.


[Unreleased]: https://gitlab.com/susurrus/serialport-rs/-/compare/4.0.0...HEAD
[4.0.0]: https://gitlab.com/susurrus/serialport-rs/-/compare/3.3.0...4.0.0
[3.3.0]: https://gitlab.com/susurrus/serialport-rs/-/compare/3.2.0...3.3.0
[3.2.0]: https://gitlab.com/susurrus/serialport-rs/-/compare/3.1.0...3.2.0
[3.1.0]: https://gitlab.com/susurrus/serialport-rs/-/compare/3.0.0...3.1.0
[3.0.0]: https://gitlab.com/susurrus/serialport-rs/-/compare/2.3.0...3.0.0
[2.3.0]: https://gitlab.com/susurrus/serialport-rs/-/compare/2.1.0...2.3.0
[2.1.0]: https://gitlab.com/susurrus/serialport-rs/-/compare/2.0.0...2.1.0
[2.0.0]: https://gitlab.com/susurrus/serialport-rs/-/compare/1.0.1...2.0.0
[1.0.1]: https://gitlab.com/susurrus/serialport-rs/-/compare/1.0.0...1.0.1
[1.0.0]: https://gitlab.com/susurrus/serialport-rs/-/compare/v0.9.0...1.0.0
[0.9.0]: https://gitlab.com/susurrus/serialport-rs/-/compare/v0.3.0...v0.9.0
[0.3.0]: https://gitlab.com/susurrus/serialport-rs/-/compare/v0.2.4...v0.3.0
[0.2.4]: https://gitlab.com/susurrus/serialport-rs/-/compare/v0.2.3...v0.2.4
[0.2.3]: https://gitlab.com/susurrus/serialport-rs/-/compare/v0.2.2...v0.2.3
[0.2.2]: https://gitlab.com/susurrus/serialport-rs/-/compare/v0.2.1...v0.2.2
[0.2.1]: https://gitlab.com/susurrus/serialport-rs/-/compare/v0.2.0...v0.2.1
[0.2.0]: https://gitlab.com/susurrus/serialport-rs/-/compare/v0.1.1...v0.2.0
[0.1.1]: https://gitlab.com/susurrus/serialport-rs/-/compare/v0.1.0...v0.1.1
[0.1.0]: https://gitlab.com/susurrus/serialport-rs/-/tags/v0.1.0