aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/CHANGELOG.md3
-rw-r--r--embassy-stm32/src/usart/buffered.rs37
2 files changed, 26 insertions, 14 deletions
diff --git a/embassy-stm32/CHANGELOG.md b/embassy-stm32/CHANGELOG.md
index f4cfc14cc..a6ee5c4b8 100644
--- a/embassy-stm32/CHANGELOG.md
+++ b/embassy-stm32/CHANGELOG.md
@@ -27,7 +27,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
27- fix: Cut down the capabilities of the STM32L412 and L422 RTC as those are missing binary timer mode and underflow interrupt. 27- fix: Cut down the capabilities of the STM32L412 and L422 RTC as those are missing binary timer mode and underflow interrupt.
28- fix: Allow configuration of the internal pull up/down resistors on the pins for the Qei peripheral, as well as the Qei decoder mode. 28- fix: Allow configuration of the internal pull up/down resistors on the pins for the Qei peripheral, as well as the Qei decoder mode.
29- feat: stm32/rcc/mco: Added support for IO driver strength when using Master Clock Out IO. This changes signature on Mco::new taking a McoConfig struct ([#4679](https://github.com/embassy-rs/embassy/pull/4679)) 29- feat: stm32/rcc/mco: Added support for IO driver strength when using Master Clock Out IO. This changes signature on Mco::new taking a McoConfig struct ([#4679](https://github.com/embassy-rs/embassy/pull/4679))
30- feat: derive Clone, Copy and defmt::Format for all SPI-related configs
30- feat: stm32/usart: add `eager_reads` option to control if buffered readers return as soon as possible or after more data is available ([#4668](https://github.com/embassy-rs/embassy/pull/4668)) 31- feat: stm32/usart: add `eager_reads` option to control if buffered readers return as soon as possible or after more data is available ([#4668](https://github.com/embassy-rs/embassy/pull/4668))
32- feat: stm32/usart: add `de_assertion_time` and `de_deassertion_time` config options
33- change: stm32/uart: BufferedUartRx now returns all available bytes from the internal buffer
31 34
32## 0.4.0 - 2025-08-26 35## 0.4.0 - 2025-08-26
33 36
diff --git a/embassy-stm32/src/usart/buffered.rs b/embassy-stm32/src/usart/buffered.rs
index 83aa4439b..165f2e88e 100644
--- a/embassy-stm32/src/usart/buffered.rs
+++ b/embassy-stm32/src/usart/buffered.rs
@@ -565,24 +565,30 @@ impl<'d> BufferedUartRx<'d> {
565 poll_fn(move |cx| { 565 poll_fn(move |cx| {
566 let state = self.state; 566 let state = self.state;
567 let mut rx_reader = unsafe { state.rx_buf.reader() }; 567 let mut rx_reader = unsafe { state.rx_buf.reader() };
568 let data = rx_reader.pop_slice(); 568 let mut buf_len = 0;
569 let mut data = rx_reader.pop_slice();
569 570
570 if !data.is_empty() { 571 while !data.is_empty() && buf_len < buf.len() {
571 let len = data.len().min(buf.len()); 572 let data_len = data.len().min(buf.len() - buf_len);
572 buf[..len].copy_from_slice(&data[..len]); 573 buf[buf_len..buf_len + data_len].copy_from_slice(&data[..data_len]);
574 buf_len += data_len;
573 575
574 let do_pend = state.rx_buf.is_full(); 576 let do_pend = state.rx_buf.is_full();
575 rx_reader.pop_done(len); 577 rx_reader.pop_done(data_len);
576 578
577 if do_pend { 579 if do_pend {
578 self.info.interrupt.pend(); 580 self.info.interrupt.pend();
579 } 581 }
580 582
581 return Poll::Ready(Ok(len)); 583 data = rx_reader.pop_slice();
582 } 584 }
583 585
584 state.rx_waker.register(cx.waker()); 586 if buf_len != 0 {
585 Poll::Pending 587 Poll::Ready(Ok(buf_len))
588 } else {
589 state.rx_waker.register(cx.waker());
590 Poll::Pending
591 }
586 }) 592 })
587 .await 593 .await
588 } 594 }
@@ -591,21 +597,24 @@ impl<'d> BufferedUartRx<'d> {
591 loop { 597 loop {
592 let state = self.state; 598 let state = self.state;
593 let mut rx_reader = unsafe { state.rx_buf.reader() }; 599 let mut rx_reader = unsafe { state.rx_buf.reader() };
594 let data = rx_reader.pop_slice(); 600 let mut buf_len = 0;
601 let mut data = rx_reader.pop_slice();
595 602
596 if !data.is_empty() { 603 while !data.is_empty() && buf_len < buf.len() {
597 let len = data.len().min(buf.len()); 604 let data_len = data.len().min(buf.len() - buf_len);
598 buf[..len].copy_from_slice(&data[..len]); 605 buf[buf_len..buf_len + data_len].copy_from_slice(&data[..data_len]);
606 buf_len += data_len;
599 607
600 let do_pend = state.rx_buf.is_full(); 608 let do_pend = state.rx_buf.is_full();
601 rx_reader.pop_done(len); 609 rx_reader.pop_done(data_len);
602 610
603 if do_pend { 611 if do_pend {
604 self.info.interrupt.pend(); 612 self.info.interrupt.pend();
605 } 613 }
606 614
607 return Ok(len); 615 data = rx_reader.pop_slice();
608 } 616 }
617 return Ok(buf_len);
609 } 618 }
610 } 619 }
611 620