diff options
| author | Adam Greig <[email protected]> | 2025-09-18 02:04:05 +0100 |
|---|---|---|
| committer | Adam Greig <[email protected]> | 2025-10-01 21:11:09 +0100 |
| commit | ef06ff43a14fd016d271c491bd830823ee96b740 (patch) | |
| tree | 5938555ed4b9d317c7c7bad95fe400dc69f0b7c0 /embassy-stm32/src/usart | |
| parent | c87051eecb50b80114c69cedc71ed9e3fcd7bb45 (diff) | |
STM32: USART: Make BufferedUartRx return all available bytes when they wrap around the internal buffer end
Diffstat (limited to 'embassy-stm32/src/usart')
| -rw-r--r-- | embassy-stm32/src/usart/buffered.rs | 37 |
1 files changed, 23 insertions, 14 deletions
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 | ||
