use crate::codec::SerialConfig; use tokio_serial::{SerialPortBuilderExt, SerialStream}; use tokio_modbus::{ client::rtu, client::Context, slave::Slave, prelude::*, }; pub (crate) struct ModbusClient { ctx: Context } impl ModbusClient { pub fn new(serial_config: SerialConfig) -> Self { let port_name = String::from_utf8(serial_config.port).unwrap(); let parity = match serial_config.parity { 0x00 => tokio_serial::Parity::None, 0x01 => tokio_serial::Parity::Odd, 0x02 => tokio_serial::Parity::Even, _ => tokio_serial::Parity::None }; let stopbits = match serial_config.stopbits { 0x01 => tokio_serial::StopBits::One, 0x02 => tokio_serial::StopBits::Two, _ => tokio_serial::StopBits::One }; let builder = tokio_serial::new(port_name, serial_config.baudrate) .data_bits(tokio_serial::DataBits::Eight) .stop_bits(stopbits) .parity(parity) .timeout(std::time::Duration::from_millis(serial_config.timeout as u64)); // 2. 建立串口连接 let port = builder.open_native_async().unwrap(); // 3. 创建Modbus RTU客户端 (0.16.1新API) let slave_id = Slave(0x01); // 从站地址 let ctx = rtu::attach_slave(port, slave_id); Self { ctx } } }