This commit is contained in:
anlicheng 2025-06-20 15:02:36 +08:00
parent 55006eb3b1
commit 724bedebf5
2 changed files with 53 additions and 1 deletions

View File

@ -1,4 +1,5 @@
mod codec; mod codec;
mod modbus_client;
use tokio::net::{UnixListener, UnixStream}; use tokio::net::{UnixListener, UnixStream};
//use tokio_util::codec::{Framed, LinesCodec}; //use tokio_util::codec::{Framed, LinesCodec};
@ -8,6 +9,7 @@ use tokio::io::AsyncReadExt;
use std::io::{self, Read, Write}; use std::io::{self, Read, Write};
use std::process; use std::process;
use crate::modbus_client::ModbusClient;
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
@ -51,7 +53,8 @@ async fn main() {
match data[0] { match data[0] {
0x01 => { 0x01 => {
let config = codec::parse_serial_config(&data[1..]).unwrap(); let config = codec::parse_serial_config(&data[1..]).unwrap();
println!("{:?}", config) println!("{:?}", config);
let client = ModbusClient::new(config);
}, },
_ => { _ => {

49
src/modbus_client.rs Normal file
View File

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