1 个稳定版本
| 4.0.2 | 2021 年 5 月 4 日 |
|---|
#1009 在 硬件支持
被 2 crates 使用
125KB
2.5K SLoC
简介
serialport-rs 是 Rust 的一个通用跨平台串口库。它在 POSIX 和 Windows 系统上提供阻塞 I/O 接口和端口枚举。
有关异步 I/O 功能,请参阅 mio-serial 和 tokio-serial Crates。
此 crate 的规范仓库位于 GitLab 上,但它是通过 Travis CI 进行测试的 GitHub 上的镜像。如需报告问题或贡献代码,请通过 GitLab 进行。
概述
该库通过 SerialPort 特性暴露跨平台的串口功能。该库旨在使 API 使用起来尽可能简单,以鼓励默认的跨平台开发。因此,建议使用派生的 Box<dyn SerialPort> 类型。为了暴露附加的平台特定功能,直接使用平台特定的结构:POSIX 系统上的 TTYPort 和 Windows 上的 COMPort。
大多数平台上都提供了串口枚举。Linux 上的实现使用 glibc,依赖于外部动态库 libudev,该库需要在最终二进制文件运行的系统上可用。即使禁用此功能,枚举仍将可用,但不会暴露太多信息,并且可能返回不存在的物理端口。但是,可以通过禁用默认的 libudev 功能来删除此依赖。
$ cargo build --no-default-features
使用方法
列出可用端口
let ports = serialport::available_ports().expect("No ports found!");
for p in ports {
println!("{}", p.port_name);
}
打开和配置端口
let port = serialport::new("/dev/ttyUSB0", 115_200)
.timeout(Duration::from_millis(10))
.open().expect("Failed to open port");
向端口写入
let output = "This is a test. This is only a test.".as_bytes();
port.write(output).expect("Write failed!");
从端口读取(默认为阻塞,超时时间为 0ms)
let mut serial_buf: Vec<u8> = vec![0; 32];
port.read(serial_buf.as_mut_slice()).expect("Found no data!");
某些平台通过 open_native() 方法公开了附加功能
let port = serialport::new("/dev/ttyUSB0", 115_200)
.open_native().expect("Failed to open port");
关闭端口
serialport-rs 使用资源获取初始化(RAII)范式,因此关闭端口是在 SerialPort 对象被 Drop(显式或隐式地使用 std::mem::drop (std::mem::drop(port)))释放时完成的。
示例
包含了一些示例,有助于展示该库的功能,并有助于调试软件或硬件错误。
- clear_input_buffer - 展示查询和清除驱动程序输入缓冲区
- clear_output_buffer - 展示查询和清除驱动程序输出缓冲区
- duplex - 测试端口是否可以成功克隆
- hardware_check - 检查单个端口或连接到彼此的端口对的功能
- list_ports - 列出可用的串行端口
- pseudo_terminal - 仅适用于 Unix。测试是否可以创建伪终端对
- receive_data - 输出端口接收到的数据
- transmit - 以不同的端口配置在端口上定期发送数据。对于调试很有用
依赖项
支持 Rust 版本 1.36.0 及更高版本。
对于 GNU Linux,需要 pkg-config 头文件
- Ubuntu:
sudo apt install pkg-config - Fedora:
sudo dnf install pkgconf-pkg-config
对于其他发行版,它们可能通过 pkgconf 软件包提供 pkg-config。
对于 GNU Linux,还需要 libudev 头文件(除非您禁用了默认的 libudev 功能)
- Ubuntu:
sudo apt install libudev-dev - Fedora:
sudo dnf install systemd-devel
平台支持
平台支持分为两个等级
- 第一级 - 在 CI 中运行针对此目标构建和测试。任一失败都会阻止新代码的加入。
- 第二级 - 在 CI 中运行针对此目标的构建。CI 中不运行测试。
第一级
- Linux
i586-unknown-linux-musli686-unknown-linux-gnui686-unknown-linux-muslx86_64-unknown-linux-gnux86_64-unknown-linux-musl
- MacOS/iOS
x86_64-apple-darwin
- Windows
i686-pc-windows-gnui686-pc-windows-msvcx86_64-pc-windows-gnux86_64-pc-windows-msvc
第二级
- Android
aarch64-linux-android(无串行枚举)arm-linux-androideabi(无串行枚举)armv7-linux-androideabi(无串行枚举)i686-linux-android(无串行枚举)x86_64-linux-android(无串行枚举)
- FreeBSD
i686-unknown-freebsdx86_64-unknown-freebsd
- Linux
aarch64-unknown-linux-gnuaarch64-unknown-linux-muslarm-unknown-linux-gnueabiarm-unknown-linux-musleabiarmv5te-unknown-linux-gnueabiarmv5te-unknown-linux-musleabiarmv7-unknown-linux-gnueabihfarmv7-unknown-linux-musleabihfi586-unknown-linux-gnumips-unknown-linux-gnumips-unknown-linux-muslmips64-unknown-linux-gnuabi64mips64el-unknown-linux-gnuabi64mipsel-unknown-linux-gnumipsel-unknown-linux-muslpowerpc-unknown-linux-gnupowerpc64-unknown-linux-gnupowerpc64le-unknown-linux-gnus390x-unknown-linux-gnusparc64-unknown-linux-gnu
- MacOS/iOS
aarch64-apple-iosx86_64-apple-ios
- NetBSD
x86_64-unknown-netbsd(无串行枚举)
硬件支持
本库已被开发用于支持所有平台上的所有串行端口设备。为了确定您的平台支持程度,请运行本库提供的 hardware_check 示例。它将测试驱动程序以确认端口支持所有可能的设置。此外,如果您有两个端口物理配置为通信,它将测试该设置的数据传输是否正确。如果您在设备上遇到问题,请提交错误报告并识别所使用的硬件、操作系统和驱动程序。
已知问题
| 硬件 | 操作系统 | 驱动程序 | 问题 |
|---|---|---|---|
| FTDI TTL-232R | Linux | ftdi_sio, Linux 4.14.11 | 硬件不支持5或6个数据位,但驱动程序谎称支持5。 |
许可
本库采用Mozilla公共许可证,版本2.0授权。
贡献
请打开GitLab上的问题或合并请求以进行贡献。根据MPL2.0许可证定义,您提交的代码贡献应授权为上述内容,无任何附加条款或条件。
致谢
特别感谢dcuddeback、willem66745和apoloval,他们编写了原始的serial-rs库,本库在很大程度上借鉴了该库。
依赖项
~1.6–2.4MB
~45K SLoC