|
3 | 3 |
|
4 | 4 | //! Asynchronous RTU client example
|
5 | 5 |
|
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"; |
9 | 10 |
|
10 |
| - use tokio_modbus::prelude::*; |
| 11 | +const BAUD_RATE: u32 = 19_200; |
11 | 12 |
|
12 |
| - let tty_path = "/dev/ttyUSB0"; |
13 |
| - let slave = Slave(0x17); |
| 13 | +const SERVER: Slave = Slave(0x17); |
14 | 14 |
|
15 |
| - let builder = tokio_serial::new(tty_path, 19200); |
16 |
| - let port = SerialStream::open(&builder).unwrap(); |
| 15 | +const SENSOR_ADDRESS: Address = 0x082B; |
17 | 16 |
|
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 { |
23 | 32 | // The response variant will always match its corresponding request variant if successful.
|
24 | 33 | unreachable!();
|
25 | 34 | };
|
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:?}"); |
27 | 43 |
|
28 | 44 | println!("Disconnecting");
|
29 |
| - conn.disconnect().await?; |
| 45 | + context.disconnect().await?; |
30 | 46 |
|
31 | 47 | Ok(())
|
32 | 48 | }
|
0 commit comments