@@ -79,12 +79,58 @@ async fn main() -> Result<(), Box<dyn Error>> {
7979 let mut transport = Framed::new(stream, TcpClientCodec);
8080 let frame = Frame::tcp();
8181 let request = frame.read_coils_request(0x01, 0x02, 0x08);
82+ println!("{}", request);
83+ transport.send(request).await?;
84+ while let Some(response) = transport.next().await {
85+ return match response {
86+ Ok(response) => {
87+ println!("{}", response);
88+ Ok(())
89+ }
90+ Err(e) => {
91+ Err(e.into())
92+ }
93+ }
94+ }
95+ Ok(())
96+ }
97+ ```
8298
99+ A simple Modbus RTU Client:
100+ ``` rust,no_run
101+ use futures::{SinkExt, StreamExt};
102+ use tokio_serial::SerialStream;
103+ use tokio_util::codec::Framed;
104+ use easy_modbus::{Frame, Response};
105+ use easy_modbus::codec::RtuClientCodec;
106+ #[tokio::main(flavor = "current_thread")]
107+ async fn main() -> Result<(), Box<dyn std::error::Error>> {
108+ let tty_path = "COM4";
109+ let rate = 9600;
110+ let slave = 0x01;
111+ let serial_builder = tokio_serial::new(tty_path, rate);
112+ let port = SerialStream::open(&serial_builder).unwrap();
113+ let mut transport = Framed::new(port, RtuClientCodec);
114+ let frame = Frame::rtu();
115+ let request = frame.read_multiple_holding_registers_request(slave, 0x00, 0x02);
116+ println!("Request:\t{}", request);
83117 transport.send(request).await?;
84118 while let Some(response) = transport.next().await {
85119 match response {
86120 Ok(response) => {
87- println!("{:?}", response);
121+ println!("Response:\t{}", response);
122+ match response {
123+ Response::ReadMultipleHoldingRegisters(_, res) => {
124+ let a = res.get_values();
125+ let h = ((a[0] as u16 * 256) + a[1] as u16) as f64 / 10.0;
126+ let t = ((a[2] as u16 * 256) + a[3] as u16) as f64 / 10.0;
127+ println!("h {} t {}", h, t);
128+ return Ok(())
129+ }
130+ _ => {
131+ println!("unknown")
132+ }
133+ }
88134 }
89135 Err(e) => {
90136 return Err(e.into());
0 commit comments