diff --git a/embassy-stm32-examples/src/bin/usart.rs b/embassy-stm32-examples/src/bin/usart.rs index e3d323da..d35fbf9f 100644 --- a/embassy-stm32-examples/src/bin/usart.rs +++ b/embassy-stm32-examples/src/bin/usart.rs @@ -25,9 +25,13 @@ async fn main_task() { let config = Config::default(); let mut usart = Uart::new(p.USART3, p.PD9, p.PD8, config, 16_000_000); + usart.bwrite_all(b"Hello Embassy World!\r\n").unwrap(); + info!("wrote Hello, starting echo"); + + let mut buf = [0u8; 1]; loop { - info!("wrote"); - usart.bwrite_all(b"Hello Embassy World!\r\n").unwrap(); + usart.read(&mut buf).unwrap(); + usart.bwrite_all(&buf).unwrap(); } } diff --git a/embassy-stm32/src/usart/usart_v1.rs b/embassy-stm32/src/usart/usart_v1.rs index d8b6cabe..baaf4fa3 100644 --- a/embassy-stm32/src/usart/usart_v1.rs +++ b/embassy-stm32/src/usart/usart_v1.rs @@ -102,6 +102,34 @@ impl<'d, T: Instance> Uart<'d, T> { phantom: PhantomData, } } + + pub fn read(&mut self, buffer: &mut [u8]) -> Result<(), Error> { + unsafe { + let r = self.inner.regs(); + for b in buffer { + loop { + let sr = r.sr().read(); + if sr.pe() { + r.dr().read(); + return Err(Error::Parity); + } else if sr.fe() { + r.dr().read(); + return Err(Error::Framing); + } else if sr.ne() { + r.dr().read(); + return Err(Error::Noise); + } else if sr.ore() { + r.dr().read(); + return Err(Error::Overrun); + } else if sr.rxne() { + break; + } + } + *b = r.dr().read().0 as u8; + } + } + Ok(()) + } } impl<'d, T: Instance> embedded_hal::blocking::serial::Write for Uart<'d, T> {