From e256f1360b4dff74f712b35db6a5f1bdf794a131 Mon Sep 17 00:00:00 2001 From: qwerty19106 Date: Thu, 3 Jul 2025 18:02:50 +0400 Subject: [PATCH] Fix impl embedded_hal_nb::serial::Write for embassy_stm32::usart::UartTx --- embassy-stm32/src/usart/mod.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/embassy-stm32/src/usart/mod.rs b/embassy-stm32/src/usart/mod.rs index b3f8bc00c..8c9028f08 100644 --- a/embassy-stm32/src/usart/mod.rs +++ b/embassy-stm32/src/usart/mod.rs @@ -550,6 +550,20 @@ impl<'d, M: Mode> UartTx<'d, M> { reconfigure(self.info, self.kernel_clock, config) } + /// Write a single u8 if there is tx empty, otherwise return WouldBlock + pub(crate) fn nb_write(&mut self, byte: u8) -> Result<(), nb::Error> { + let r = self.info.regs; + let sr = sr(r).read(); + if sr.txe() { + unsafe { + tdr(r).write_volatile(byte); + } + Ok(()) + } else { + Err(nb::Error::WouldBlock) + } + } + /// Perform a blocking UART write pub fn blocking_write(&mut self, buffer: &[u8]) -> Result<(), Error> { let r = self.info.regs; @@ -1864,7 +1878,7 @@ impl<'d, M: Mode> embedded_hal_nb::serial::Read for UartRx<'d, M> { impl<'d, M: Mode> embedded_hal_nb::serial::Write for UartTx<'d, M> { fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { - self.blocking_write(&[char]).map_err(nb::Error::Other) + self.nb_write(char) } fn flush(&mut self) -> nb::Result<(), Self::Error> {