2025-06-21 01:02:47 +08:00
fix
2025-06-21 01:02:47 +08:00
2025-06-17 12:26:09 +08:00
fix
2025-06-20 14:40:51 +08:00
fix
2025-06-20 14:40:51 +08:00
fix
2025-06-19 22:01:06 +08:00

use tokio_serial::{SerialPortBuilderExt, SerialStream};
use tokio_modbus::{
    client::rtu,
    slave::Slave,
    prelude::*,
};
use futures::future::try_join;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 配置串口参数 (Windows使用 "COM3")
    let port_name = "/dev/ttyUSB0";
    let builder = tokio_serial::new(port_name, 9600)
        .data_bits(tokio_serial::DataBits::Eight)
        .stop_bits(tokio_serial::StopBits::One)
        .parity(tokio_serial::Parity::None)
        .timeout(std::time::Duration::from_millis(1000));

    // 2. 建立串口连接
    let port = builder.open_native_async()?;

    // 3. 创建Modbus RTU客户端 (0.16.1新API)
    let slave_id = Slave(0x01); // 从站地址
    let mut ctx = rtu::attach_slave(port, slave_id);

    // 4. 并发执行读写操作
    // let (read_result, write_result) = try_join(
    //     read_holding_registers(&mut ctx),
    //     write_single_register(&mut ctx)
    // ).await?;
    //
    // println!("读取结果: {:?}", read_result);
    // println!("写入结果: {:?}", write_result);

    Ok(())
}

// 读取保持寄存器 (功能码0x03)
async fn read_holding_registers(ctx: &mut impl Reader) -> Result<Vec<u16>, Box<dyn std::error::Error>> {
    let response = ctx.read_holding_registers(0x00, 5).await?;
    Ok(response.unwrap())
}

// 写入单个寄存器 (功能码0x06)
async fn write_single_register(ctx: &mut impl Writer ) -> Result<(), Box<dyn std::error::Error>> {
    ctx.write_single_register(0x01, 1234).await?;
    Ok(())
}
Description
基于rust的通过系统IO实现的modbus代理
Readme 55 KiB
Languages
Rust 100%