modbus_agent/readme.txt
2025-06-19 22:01:06 +08:00

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