Merge pull request #3915 from embedded-rust-iml/fix/BufferedUartRx-nb-read

fix: BufferedUartRx embedded_hal_nb::serial::Read impl
This commit is contained in:
Dario Nieuwenhuis 2025-02-24 14:34:13 +00:00 committed by GitHub
commit 00ef474b94
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -908,26 +908,17 @@ impl<'d> embedded_hal_02::serial::Read<u8> for BufferedUartRx<'d> {
type Error = Error; type Error = Error;
fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
let r = self.info.regs; let state = self.state;
unsafe { let mut rx_reader = unsafe { state.rx_buf.reader() };
let sr = sr(r).read();
if sr.pe() { let do_pend = state.rx_buf.is_full();
rdr(r).read_volatile(); if let Some(data) = rx_reader.pop_one() {
Err(nb::Error::Other(Error::Parity)) if do_pend {
} else if sr.fe() { self.info.interrupt.pend();
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)
} }
Ok(data)
} else {
Err(nb::Error::WouldBlock)
} }
} }
} }