diff options
| -rw-r--r-- | embassy-stm32/CHANGELOG.md | 3 | ||||
| -rw-r--r-- | embassy-stm32/src/usart/buffered.rs | 37 |
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 | ||
