rust串口通信实现方法及示例代码
最近在尝试用Rust实现串口通信功能,但遇到了一些问题。想请教各位:
- Rust中实现串口通信有哪些常用库?serialport-rs和tokio-serial哪个更适合新手?
- 能否分享一个简单的串口通信示例代码,包括初始化和数据传输?
- 在Linux和Windows系统下配置串口有没有特别需要注意的地方?
- 如何处理串口通信中的超时和错误情况?
我的开发环境是Rust 1.70+,主要用在嵌入式设备通信。感谢各位的指点!
2 回复
使用Rust实现串口通信,推荐使用serialport库。示例代码:
use serialport::{SerialPort, SerialPortSettings};
use std::time::Duration;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let port_name = "COM1"; // Windows
// let port_name = "/dev/ttyUSB0"; // Linux
let settings = SerialPortSettings {
baud_rate: 9600,
timeout: Duration::from_millis(10),
..Default::default()
};
let mut port = serialport::open_with_settings(port_name, &settings)?;
// 发送数据
port.write(b"Hello")?;
// 读取数据
let mut buf = vec![0; 128];
let n = port.read(&mut buf)?;
println!("收到: {:?}", &buf[..n]);
Ok(())
}
在Cargo.toml中添加依赖:
[dependencies]
serialport = "4.0"
在 Rust 中实现串口通信,可以使用 serialport 库。以下是实现方法和示例代码:
步骤:
- 添加依赖:在
Cargo.toml中添加serialport = "5"。 - 配置串口参数(波特率、数据位等)。
- 打开串口并读写数据。
示例代码:
use serialport::{SerialPort, SerialPortSettings};
use std::io::{self, Write};
use std::time::Duration;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 配置串口参数
let settings = SerialPortSettings {
baud_rate: 9600,
data_bits: serialport::DataBits::Eight,
flow_control: serialport::FlowControl::None,
parity: serialport::Parity::None,
stop_bits: serialport::StopBits::One,
timeout: Duration::from_millis(1000),
};
// 打开串口(根据系统替换端口名)
let port_name = if cfg!(windows) { "COM3" } else { "/dev/ttyUSB0" };
let mut port = serialport::open_with_settings(&port_name, &settings)?;
// 发送数据
let data = b"Hello, Serial!\n";
port.write_all(data)?;
// 读取数据
let mut buffer = vec![0; 128];
let bytes_read = port.read(&mut buffer)?;
println!("收到数据: {:?}", &buffer[..bytes_read]);
Ok(())
}
关键说明:
- 端口名:Windows 通常为
COMx,Linux/macOS 为/dev/ttyXXX。 - 错误处理:使用
?简化错误传播。 - 超时设置:避免读取阻塞。
运行准备:
- 安装 Rust 环境。
- 执行
cargo add serialport添加依赖。 - 根据实际设备修改端口名和参数。
此代码实现了基础的串口数据发送与接收,适用于常见嵌入式或设备通信场景。

