diff --git a/src/codec.rs b/src/codec.rs index 499a092..c1dee00 100644 --- a/src/codec.rs +++ b/src/codec.rs @@ -10,6 +10,14 @@ pub(crate) struct SerialConfig { pub timeout: u32, // Timeout:32 } +#[derive(Debug)] +pub(crate) struct Request { + pub packet_id: u32, + pub slave_id: u8, + pub address: u16, + pub cnt: u16, +} + pub(crate) fn parse_serial_config(data: &[u8]) -> std::io::Result { let mut cursor = Cursor::new(data); @@ -29,4 +37,20 @@ pub(crate) fn parse_serial_config(data: &[u8]) -> std::io::Result parity, timeout, }) +} + +pub(crate) fn parse_request(data: &[u8]) -> std::io::Result { + let mut cursor = Cursor::new(data); + + let packet_id = cursor.read_u32::()?; + let slave_id = cursor.read_u8()?; + let address = cursor.read_u16::()?; + let cnt = cursor.read_u16::()?; + + Ok(Request { + packet_id, + slave_id, + address, + cnt, + }) } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index f444c0a..d309c40 100644 --- a/src/main.rs +++ b/src/main.rs @@ -34,6 +34,8 @@ async fn main() { println!("port: {:?}", c.port); + let mut client: Option = None; + loop { // 1. 读取4字节长度前缀 (big-endian) let mut len_bytes = [0u8; 2]; @@ -53,29 +55,44 @@ async fn main() { 0x01 => { let config = codec::parse_serial_config(&data[1..]).unwrap(); println!("{:?}", config); - let client = ModbusClient::new(config); + client = Option::from(ModbusClient::new(config)); + }, + 0x02 => { + let request = codec::parse_request(&data[1..]).unwrap(); + println!("request {:?}", request); + + if let Some(client) = client.as_mut() { + match client.request(request.slave_id, request.address, request.cnt).await { + Ok(vec) => { + + } + Err(e) => { + + } + } + } + }, _ => { } } - - - // let data_str = String::from_utf8(data).unwrap_or_else(|_| { - // eprintln!("Invalid UTF-8 data"); - // process::exit(-1); - // }); - // - // // 3. 处理数据并生成响应 - // let response = format!("Processed: {}", data_str); - // let response_bytes = response.as_bytes(); - // - // // 4. 写入响应(长度前缀 + 数据) - // stdout.write_all(&(response_bytes.len() as u32).to_be_bytes())?; - // stdout.write_all(response_bytes)?; - // stdout.flush()?; // 确保立即发送 } + // let data_str = String::from_utf8(data).unwrap_or_else(|_| { + // eprintln!("Invalid UTF-8 data"); + // process::exit(-1); + // }); + // + // // 3. 处理数据并生成响应 + // let response = format!("Processed: {}", data_str); + // let response_bytes = response.as_bytes(); + // + // // 4. 写入响应(长度前缀 + 数据) + // stdout.write_all(&(response_bytes.len() as u32).to_be_bytes())?; + // stdout.write_all(response_bytes)?; + // stdout.flush()?; // 确保立即发送 + } async fn handle_client(mut stream: UnixStream) -> Result<(), Box> {