modbus_iiot/tcp/
streamtelegram.rs1
2
3use std::io::{Write, Read};
4use std::net::TcpStream;
5use core::modbustelegram::ModbusTelegram;
6
7fn read_telegram_from_stream ( stream : &mut TcpStream, expected_bytes : u8 ) -> Result< ModbusTelegram, String >
10{
11 let mut reply : Result< ModbusTelegram, String > = Err( "Tcp Read Failed".to_string () );
12
13 let mut data : Vec< u8 > = vec![ 0; expected_bytes as usize ];
14 let response = stream.read ( &mut data );
15
16 if response.is_ok ()
17 {
18 if let Some( telegram ) = ModbusTelegram::new_from_bytes ( &data )
19 {
20 reply = Ok( telegram );
21 }
22 }
23
24 return reply;
25}
26
27fn write_telegram_to_stream ( stream : &mut TcpStream, telegram : &ModbusTelegram ) -> Result< bool, String >
30{
31 let mut reply : Result< bool, String > = Err( "Tcp Write Failed".to_string () );
32
33 if let Some( bytes ) = telegram.get_bytes ()
34 {
35 let response = stream.write_all ( &bytes );
36
37 if response.is_ok ()
38 {
39 reply = Ok( true );
40 }
41 }
42
43 return reply;
44}
45
46pub fn process_modbus_telegram ( stream : &mut TcpStream, telegram : &Option< ModbusTelegram > ) -> Option< ModbusTelegram >
49{
50 let mut reply : Option< ModbusTelegram > = None;
51
52 if telegram.is_some ()
53 {
54 let write_telegram : &ModbusTelegram = telegram.as_ref ().unwrap ();
55 let write_response : Result< bool, String > = write_telegram_to_stream ( stream,
56 write_telegram );
57 if write_response.is_ok ()
58 {
59 let expected_bytes : Option< u8 > = write_telegram.get_expected_byte_count ();
60 let read_response : Result< ModbusTelegram, String > = read_telegram_from_stream ( stream,
61 expected_bytes.unwrap () );
62 if read_response.is_ok ()
63 {
64 reply = Some( read_response.unwrap ( ) );
65 }
66 }
67 }
68
69 return reply;
70}