diff --git a/src/main.rs b/src/main.rs index 0ca2c88..6c400ef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ mod codec; +mod modbus_client; use tokio::net::{UnixListener, UnixStream}; //use tokio_util::codec::{Framed, LinesCodec}; @@ -8,6 +9,7 @@ use tokio::io::AsyncReadExt; use std::io::{self, Read, Write}; use std::process; +use crate::modbus_client::ModbusClient; #[tokio::main] async fn main() { @@ -51,7 +53,8 @@ async fn main() { match data[0] { 0x01 => { let config = codec::parse_serial_config(&data[1..]).unwrap(); - println!("{:?}", config) + println!("{:?}", config); + let client = ModbusClient::new(config); }, _ => { diff --git a/src/modbus_client.rs b/src/modbus_client.rs new file mode 100644 index 0000000..0af9ca2 --- /dev/null +++ b/src/modbus_client.rs @@ -0,0 +1,49 @@ +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 + } + } +} \ No newline at end of file