Rust串口通信如何实现

在Rust中如何实现串口通信?需要用到哪些库?能否提供一个简单的代码示例?我在Windows/Linux平台上运行时需要注意哪些兼容性问题?串口配置参数如波特率、数据位等该如何正确设置?遇到错误时有哪些常见的排查方法?

2 回复

使用Rust实现串口通信,推荐使用serialport库。步骤如下:

  1. 添加依赖:serialport = "4.2"
  2. 代码示例:
use serialport::{SerialPort, SerialPortInfo};
let port = serialport::new("/dev/ttyUSB0", 9600)
    .open()
    .expect("打开串口失败");
  1. 可设置数据位、停止位、校验位等参数
  2. 通过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 位
  • 校验位:无、奇、偶校验
  • 流控制:无、硬件、软件

注意事项

  1. 在 Linux 下设备路径为 /dev/ttyUSB0
  2. 需要相应权限(Linux 下可添加用户到 dialout 组)
  3. 超时设置可避免永久阻塞
  4. 建议使用异步方式处理并发读写

错误处理

使用 ? 操作符或 match 处理可能的错误,如端口不存在、权限不足等。

这是最基本的串口通信实现,实际使用时可能需要根据具体协议处理数据帧和错误校验。

回到顶部