49 lines
1.4 KiB
Rust
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
|
|
}
|
|
}
|
|
} |