modbus_agent/src/modbus_client.rs
2025-06-20 15:02:36 +08:00

49 lines
1.4 KiB
Rust

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
}
}
}