From 76756ee702c76f925b6c0e1c28d5695ce321c894 Mon Sep 17 00:00:00 2001 From: Maximilian Rozwora Date: Mon, 24 Feb 2025 14:34:41 +0100 Subject: [PATCH 1/3] fix: BufferedUartRx embedded_hal_nb::serial::Read impl --- embassy-stm32/src/usart/buffered.rs | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/embassy-stm32/src/usart/buffered.rs b/embassy-stm32/src/usart/buffered.rs index 7bbe01a00..3d8268de7 100644 --- a/embassy-stm32/src/usart/buffered.rs +++ b/embassy-stm32/src/usart/buffered.rs @@ -908,26 +908,16 @@ impl<'d> embedded_hal_02::serial::Read for BufferedUartRx<'d> { type Error = Error; fn read(&mut self) -> Result> { - let r = self.info.regs; - unsafe { - let sr = sr(r).read(); - if sr.pe() { - rdr(r).read_volatile(); - Err(nb::Error::Other(Error::Parity)) - } else if sr.fe() { - rdr(r).read_volatile(); - Err(nb::Error::Other(Error::Framing)) - } else if sr.ne() { - rdr(r).read_volatile(); - Err(nb::Error::Other(Error::Noise)) - } else if sr.ore() { - rdr(r).read_volatile(); - Err(nb::Error::Other(Error::Overrun)) - } else if sr.rxne() { - Ok(rdr(r).read_volatile()) - } else { - Err(nb::Error::WouldBlock) + let state = self.state; + let mut rx_reader = unsafe { state.rx_buf.reader() }; + + if let Some(data) = rx_reader.pop_one() { + Ok(data) + } else { + if state.rx_buf.is_full() { + self.info.interrupt.pend(); } + Err(nb::Error::WouldBlock) } } } From c52f56785fbc4ad7feb7a0f61bd40f0d3563a845 Mon Sep 17 00:00:00 2001 From: Maximilian Rozwora Date: Mon, 24 Feb 2025 14:48:32 +0100 Subject: [PATCH 2/3] Apply cargo format --- embassy-stm32/src/usart/buffered.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embassy-stm32/src/usart/buffered.rs b/embassy-stm32/src/usart/buffered.rs index 3d8268de7..1cb9616d9 100644 --- a/embassy-stm32/src/usart/buffered.rs +++ b/embassy-stm32/src/usart/buffered.rs @@ -910,7 +910,7 @@ impl<'d> embedded_hal_02::serial::Read for BufferedUartRx<'d> { fn read(&mut self) -> Result> { let state = self.state; let mut rx_reader = unsafe { state.rx_buf.reader() }; - + if let Some(data) = rx_reader.pop_one() { Ok(data) } else { From 519bd8646769899040b33a42ab57ddbd869d31ae Mon Sep 17 00:00:00 2001 From: Maximilian Rozwora Date: Mon, 24 Feb 2025 15:11:14 +0100 Subject: [PATCH 3/3] fix: Check buffer full before pop_done() --- embassy-stm32/src/usart/buffered.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/embassy-stm32/src/usart/buffered.rs b/embassy-stm32/src/usart/buffered.rs index 1cb9616d9..e61558b58 100644 --- a/embassy-stm32/src/usart/buffered.rs +++ b/embassy-stm32/src/usart/buffered.rs @@ -911,12 +911,13 @@ impl<'d> embedded_hal_02::serial::Read for BufferedUartRx<'d> { let state = self.state; let mut rx_reader = unsafe { state.rx_buf.reader() }; + let do_pend = state.rx_buf.is_full(); if let Some(data) = rx_reader.pop_one() { - Ok(data) - } else { - if state.rx_buf.is_full() { + if do_pend { self.info.interrupt.pend(); } + Ok(data) + } else { Err(nb::Error::WouldBlock) } }