Skip to content

Commit d52240c

Browse files
committed
Extend example
1 parent e13d249 commit d52240c

File tree

3 files changed

+48
-20
lines changed

3 files changed

+48
-20
lines changed

examples/rtu-client.rs

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,46 @@
33

44
//! Asynchronous RTU client example
55
6-
#[tokio::main(flavor = "current_thread")]
7-
async fn main() -> Result<(), Box<dyn std::error::Error>> {
8-
use tokio_serial::SerialStream;
6+
use tokio_modbus::{prelude::*, Address, Quantity, Slave};
7+
use tokio_serial::SerialStream;
8+
9+
const SERIAL_PATH: &str = "/dev/ttyUSB0";
910

10-
use tokio_modbus::prelude::*;
11+
const BAUD_RATE: u32 = 19_200;
1112

12-
let tty_path = "/dev/ttyUSB0";
13-
let slave = Slave(0x17);
13+
const SERVER: Slave = Slave(0x17);
1414

15-
let builder = tokio_serial::new(tty_path, 19200);
16-
let port = SerialStream::open(&builder).unwrap();
15+
const SENSOR_ADDRESS: Address = 0x082B;
1716

18-
let mut conn = rtu::ClientConnection::new(port);
19-
println!("Reading a sensor value");
20-
let request = Request::ReadHoldingRegisters(0x082B, 2);
21-
let request_context = conn.send_request(request, slave).await?;
22-
let Response::ReadHoldingRegisters(value) = conn.recv_response(request_context).await?? else {
17+
const SENSOR_QUANTITY: Quantity = 2;
18+
19+
#[tokio::main(flavor = "current_thread")]
20+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
21+
let builder = tokio_serial::new(SERIAL_PATH, BAUD_RATE);
22+
let transport = SerialStream::open(&builder).unwrap();
23+
24+
let mut connection = rtu::ClientConnection::new(transport);
25+
26+
println!("Reading sensor values (request/response");
27+
let request = Request::ReadHoldingRegisters(SENSOR_ADDRESS, SENSOR_QUANTITY);
28+
let request_context = connection.send_request(request, SERVER).await?;
29+
let Response::ReadHoldingRegisters(values) =
30+
connection.recv_response(request_context).await??
31+
else {
2332
// The response variant will always match its corresponding request variant if successful.
2433
unreachable!();
2534
};
26-
println!("Sensor value is: {value:?}");
35+
println!("Sensor responded with: {values:?}");
36+
37+
println!("Reading sensor values (call");
38+
let mut context = rtu::client_context(connection, SERVER);
39+
let values = context
40+
.read_holding_registers(SENSOR_ADDRESS, SENSOR_QUANTITY)
41+
.await??;
42+
println!("Sensor responded with: {values:?}");
2743

2844
println!("Disconnecting");
29-
conn.disconnect().await?;
45+
context.disconnect().await?;
3046

3147
Ok(())
3248
}

src/client/rtu.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
66
use tokio::io::{AsyncRead, AsyncWrite};
77

8+
use crate::prelude::rtu::ClientConnection;
9+
810
use super::*;
911

1012
/// Connect to no particular Modbus slave device for sending
@@ -21,7 +23,16 @@ pub fn attach_slave<T>(transport: T, slave: Slave) -> Context
2123
where
2224
T: AsyncRead + AsyncWrite + Debug + Unpin + Send + 'static,
2325
{
24-
let client = crate::service::rtu::Client::new(transport, slave);
26+
let connection = ClientConnection::new(transport);
27+
client_context(connection, slave)
28+
}
29+
30+
/// Creates a client/server connection.
31+
pub fn client_context<T>(connection: ClientConnection<T>, server: Slave) -> Context
32+
where
33+
T: AsyncRead + AsyncWrite + Debug + Unpin + Send + 'static,
34+
{
35+
let client = crate::service::rtu::Client::new(connection, server);
2536
Context {
2637
client: Box::new(client),
2738
}

src/service/rtu.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ impl<T> Client<T>
9696
where
9797
T: AsyncRead + AsyncWrite + Unpin,
9898
{
99-
pub(crate) fn new(transport: T, slave: Slave) -> Self {
100-
let connection = ClientConnection::new(transport);
99+
pub(crate) fn new(connection: ClientConnection<T>, slave: Slave) -> Self {
101100
let slave_id = slave.into();
102101
Self {
103102
connection: Some(connection),
@@ -149,7 +148,6 @@ where
149148

150149
#[cfg(test)]
151150
mod tests {
152-
153151
use core::{
154152
pin::Pin,
155153
task::{Context, Poll},
@@ -158,6 +156,8 @@ mod tests {
158156

159157
use crate::Error;
160158

159+
use super::*;
160+
161161
#[derive(Debug)]
162162
struct MockTransport;
163163

@@ -190,8 +190,9 @@ mod tests {
190190
#[tokio::test]
191191
async fn handle_broken_pipe() {
192192
let transport = MockTransport;
193+
let connection = ClientConnection::new(transport);
193194
let mut client =
194-
crate::service::rtu::Client::new(transport, crate::service::rtu::Slave::broadcast());
195+
crate::service::rtu::Client::new(connection, crate::service::rtu::Slave::broadcast());
195196
let res = client
196197
.call(crate::service::rtu::Request::ReadCoils(0x00, 5))
197198
.await;

0 commit comments

Comments
 (0)