From 851955e3fc55a60152b713e667ad01c842fe8a27 Mon Sep 17 00:00:00 2001 From: Sofia Date: Fri, 15 May 2026 01:36:32 +0300 Subject: [PATCH] Read AT Command response properly --- src/at_commands.rs | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/at_commands.rs b/src/at_commands.rs index 609516c..373700e 100644 --- a/src/at_commands.rs +++ b/src/at_commands.rs @@ -1,6 +1,10 @@ +use alloc::string::String; +use alloc::vec::Vec; use core::fmt::Write; use esp_hal::{Blocking, delay::Delay, gpio::Output, uart::Uart}; +static RESPONSES: [&'static str; 3] = ["OK", "ERROR", "DOWNLOAD"]; + pub struct ATCommands<'a, 'd> { pub rst: Output<'a>, pub pwr_key: Output<'a>, @@ -40,8 +44,33 @@ impl<'a, 'd> ATCommands<'a, 'd> { self.uart.flush().unwrap(); self.delay.delay_millis(500); log::info!("Wrote command"); + let response = self.read_response(); + log::info!("Response: {}", response); + } + + fn read_response(&mut self) -> String { let mut buffer = [0u8; 1024]; - let length = self.uart.read(&mut buffer).unwrap(); - log::info!("text: {:?}", str::from_utf8(&buffer[..length])); + + let mut contents = String::new(); + + while { + let parts: Vec<&str> = contents.split("\r\n").collect(); + !RESPONSES.iter().any(|r| parts.contains(r)) + } { + let length = self.uart.read(&mut buffer).unwrap(); + contents += str::from_utf8(&buffer[..length]).unwrap(); + } + + let parts: Vec<&str> = contents.split("\r\n").collect(); + let (idx, _) = parts + .iter() + .enumerate() + .find(|(_, part)| RESPONSES.contains(part)) + .unwrap(); + parts + .into_iter() + .take(idx + 1) + .collect::>() + .join("\n") } }