48 lines
1.5 KiB
Plaintext
48 lines
1.5 KiB
Plaintext
use tokio_serial::{SerialPortBuilderExt, SerialStream};
|
|
use tokio_modbus::{
|
|
client::rtu,
|
|
slave::Slave,
|
|
prelude::*,
|
|
};
|
|
use futures::future::try_join;
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
// 1. 配置串口参数 (Windows使用 "COM3")
|
|
let port_name = "/dev/ttyUSB0";
|
|
let builder = tokio_serial::new(port_name, 9600)
|
|
.data_bits(tokio_serial::DataBits::Eight)
|
|
.stop_bits(tokio_serial::StopBits::One)
|
|
.parity(tokio_serial::Parity::None)
|
|
.timeout(std::time::Duration::from_millis(1000));
|
|
|
|
// 2. 建立串口连接
|
|
let port = builder.open_native_async()?;
|
|
|
|
// 3. 创建Modbus RTU客户端 (0.16.1新API)
|
|
let slave_id = Slave(0x01); // 从站地址
|
|
let mut ctx = rtu::attach_slave(port, slave_id);
|
|
|
|
// 4. 并发执行读写操作
|
|
// let (read_result, write_result) = try_join(
|
|
// read_holding_registers(&mut ctx),
|
|
// write_single_register(&mut ctx)
|
|
// ).await?;
|
|
//
|
|
// println!("读取结果: {:?}", read_result);
|
|
// println!("写入结果: {:?}", write_result);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
// 读取保持寄存器 (功能码0x03)
|
|
async fn read_holding_registers(ctx: &mut impl Reader) -> Result<Vec<u16>, Box<dyn std::error::Error>> {
|
|
let response = ctx.read_holding_registers(0x00, 5).await?;
|
|
Ok(response.unwrap())
|
|
}
|
|
|
|
// 写入单个寄存器 (功能码0x06)
|
|
async fn write_single_register(ctx: &mut impl Writer ) -> Result<(), Box<dyn std::error::Error>> {
|
|
ctx.write_single_register(0x01, 1234).await?;
|
|
Ok(())
|
|
} |