Rust串口通信如何实现
在Rust中如何实现串口通信?需要用到哪些库?能否提供一个简单的代码示例?我在Windows/Linux平台上运行时需要注意哪些兼容性问题?串口配置参数如波特率、数据位等该如何正确设置?遇到错误时有哪些常见的排查方法?
2 回复
使用Rust实现串口通信,推荐使用serialport库。步骤如下:
- 添加依赖:
serialport = "4.2" - 代码示例:
use serialport::{SerialPort, SerialPortInfo};
let port = serialport::new("/dev/ttyUSB0", 9600)
.open()
.expect("打开串口失败");
- 可设置数据位、停止位、校验位等参数
- 通过read/write方法收发数据
注意处理错误和超时情况。
在 Rust 中实现串口通信可以使用 serialport 库。以下是基本步骤和示例代码:
1. 添加依赖
在 Cargo.toml 中添加:
[dependencies]
serialport = "4.2"
tokio = { version = "1.0", features = ["full"] }
tokio-serial = "5.4"
2. 同步方式示例
use serialport::{SerialPort, SerialPortInfo};
use std::io::{self, Read, Write};
use std::time::Duration;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 获取可用串口列表
let ports = serialport::available_ports()?;
for port in ports {
println!("{}", port.port_name);
}
// 打开串口(以 COM3 为例)
let mut port = serialport::new("COM3", 9600)
.timeout(Duration::from_millis(1000))
.open()?;
// 发送数据
port.write(b"Hello, Serial!")?;
// 读取数据
let mut buffer = [0; 128];
let bytes_read = port.read(&mut buffer)?;
println!("Received: {:?}", &buffer[..bytes_read]);
Ok(())
}
3. 异步方式示例(推荐)
use tokio_serial::{SerialPortBuilderExt, SerialStream};
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 配置串口
let mut port = tokio_serial::new("COM3", 9600)
.open_native_async()?;
// 异步写入
port.write_all(b"Hello, Async Serial!").await?;
// 异步读取
let mut buf = [0; 128];
let bytes_read = port.read(&mut buf).await?;
println!("Received: {:?}", &buf[..bytes_read]);
Ok(())
}
关键配置参数
- 波特率:9600、115200 等
- 数据位:通常 8 位
- 停止位:1 或 2 位
- 校验位:无、奇、偶校验
- 流控制:无、硬件、软件
注意事项
- 在 Linux 下设备路径为
/dev/ttyUSB0等 - 需要相应权限(Linux 下可添加用户到 dialout 组)
- 超时设置可避免永久阻塞
- 建议使用异步方式处理并发读写
错误处理
使用 ? 操作符或 match 处理可能的错误,如端口不存在、权限不足等。
这是最基本的串口通信实现,实际使用时可能需要根据具体协议处理数据帧和错误校验。

