Skip to content

Commit 00ef474

Browse files
authored
Merge pull request #3915 from embedded-rust-iml/fix/BufferedUartRx-nb-read
fix: BufferedUartRx embedded_hal_nb::serial::Read impl
2 parents 6b04942 + 519bd86 commit 00ef474

File tree

1 file changed

+10
-19
lines changed

1 file changed

+10
-19
lines changed

embassy-stm32/src/usart/buffered.rs

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -908,26 +908,17 @@ impl<'d> embedded_hal_02::serial::Read<u8> for BufferedUartRx<'d> {
908908
type Error = Error;
909909

910910
fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
911-
let r = self.info.regs;
912-
unsafe {
913-
let sr = sr(r).read();
914-
if sr.pe() {
915-
rdr(r).read_volatile();
916-
Err(nb::Error::Other(Error::Parity))
917-
} else if sr.fe() {
918-
rdr(r).read_volatile();
919-
Err(nb::Error::Other(Error::Framing))
920-
} else if sr.ne() {
921-
rdr(r).read_volatile();
922-
Err(nb::Error::Other(Error::Noise))
923-
} else if sr.ore() {
924-
rdr(r).read_volatile();
925-
Err(nb::Error::Other(Error::Overrun))
926-
} else if sr.rxne() {
927-
Ok(rdr(r).read_volatile())
928-
} else {
929-
Err(nb::Error::WouldBlock)
911+
let state = self.state;
912+
let mut rx_reader = unsafe { state.rx_buf.reader() };
913+
914+
let do_pend = state.rx_buf.is_full();
915+
if let Some(data) = rx_reader.pop_one() {
916+
if do_pend {
917+
self.info.interrupt.pend();
930918
}
919+
Ok(data)
920+
} else {
921+
Err(nb::Error::WouldBlock)
931922
}
932923
}
933924
}

0 commit comments

Comments
 (0)