#dmx

dmx-termios

termios 库的分支版本

1 个不稳定版本

使用旧版 Rust 2015

0.3.0 2017年3月6日
Download history 31/week @ 2023-10-28 35/week @ 2023-11-04 27/week @ 2023-11-11 28/week @ 2023-11-18 30/week @ 2023-11-25 23/week @ 2023-12-02 22/week @ 2023-12-09 21/week @ 2023-12-16 22/week @ 2023-12-23 34/week @ 2023-12-30 38/week @ 2024-01-06 55/week @ 2024-01-13 41/week @ 2024-01-20 30/week @ 2024-01-27 41/week @ 2024-02-03 44/week @ 2024-02-10

162 每月下载量
2 个 crate 中使用(通过 dmx-serial

MIT 许可证

43KB
701

Termios 分支

David Cuddeback 编写的 termios 库的分支版本。它包含了 dmx crate 所需的额外功能。


lib.rs:

termios crate 为 Unix 操作系统上实现的 POSIX termios API 提供 Rust 绑定。termios API 定义在 IEEE Std 1003.1 ("POSIX.1") 规范 中。

入门指南

termios API 在与终端设备关联的文件描述符上操作,例如 /dev/tty*。当与其他文件描述符一起使用时,termios 函数会返回错误。所有 POSIX 标准的一部分函数都包含在 termios crate 中。当期望文件描述符时,使用类型 std::os::unix::io::RawFd,并将整数错误代码转换为 std::io::Result

termios API 的一个主要功能是配置终端设备的参数。POSIX 标准定义了一个包含参数和用于操作参数的几个函数的 termios 结构。termios crate 定义了一个安全的构造函数,该构造函数返回一个填充了打开终端设备的参数的 Termios 结构

use termios::*;
let mut termios = Termios::from_fd(fd).unwrap();

Termios 结构提供了访问 POSIX 标准中定义的字段(c_iflagc_oflagc_cflagc_lflagc_cc)的权限

termios.c_cflag |= CREAD | CLOCAL;
termios.c_lflag &= !(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ISIG | IEXTEN);
termios.c_oflag &= !OPOST;
termios.c_iflag &= !(INLCR | IGNCR | ICRNL | IGNBRK);

termios.c_cc[VMIN] = 0;
termios.c_cc[VTIME] = 0;

Termios 结构也可以使用任何标准的 termios API 函数进行操作

cfgetispeed(&termios);
cfgetospeed(&termios);
cfsetispeed(&mut termios, B9600).unwrap();
cfsetospeed(&mut termios, B9600).unwrap();
tcsetattr(fd, TCSANOW, &termios).unwrap();

可移植性

termios crate 以帮助编写可移植代码的方式组织,同时也允许在必要时访问特定于操作系统的功能。

crate 根目录包含跨 Unix 操作系统通用的类型、常量和函数定义。crate 根目录中的大多数定义来自 POSIX 标准;然而,在不同操作系统之间,对标准的支持可能不同。crate 根目录中有几个函数不是 POSIX 标准的一部分,但包括在内,因为它们在 Unix 操作系统中广泛可用。

要编写可移植代码,导入 termios crate 并仅使用 crate 根目录中的定义。

操作系统特定扩展

每个操作系统都可以定义对POSIX API的扩展。为了明确代码依赖于特定于操作系统的定义,任何非标准定义都导出在termios::os模块中。依赖特定于操作系统功能的应用程序必须显式选择。当编写依赖特定于操作系统定义的可移植代码时,通常需要使用#[cfg(...)]属性来支持不同的实现。以下是一个可移植函数的示例,该函数设置Termios结构体的最大速度。

use std::io;
use termios::{Termios,cfsetspeed};

#[cfg(target_os = "linux")]
fn set_fastest_speed(termios: &mut Termios) -> io::Result<()> {
    cfsetspeed(termios, termios::os::linux::B4000000)
}

#[cfg(target_os = "macos")]
fn set_fastest_speed(termios: &mut Termios) -> io::Result<()> {
    cfsetspeed(termios, termios::os::macos::B230400)
}

#[cfg(target_os = "freebsd")]
fn set_fastest_speed(termios: &mut Termios) -> io::Result<()> {
    cfsetspeed(termios, termios::os::freebsd::B921600)
}

#[cfg(target_os = "openbsd")]
fn set_fastest_speed(termios: &mut Termios) -> io::Result<()> {
    cfsetspeed(termios, termios::os::openbsd::B921600)
}

let mut termios = Termios::from_fd(fd).unwrap();
set_fastest_speed(&mut termios).unwrap();

依赖关系

~62KB