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> { // 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, Box> { let response = ctx.read_holding_registers(0x00, 5).await?; Ok(response.unwrap()) } // 写入单个寄存器 (功能码0x06) async fn write_single_register(ctx: &mut impl Writer ) -> Result<(), Box> { ctx.write_single_register(0x01, 1234).await?; Ok(()) }