aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/usart
diff options
context:
space:
mode:
authorAdam Greig <[email protected]>2025-09-18 02:04:05 +0100
committerAdam Greig <[email protected]>2025-10-01 21:11:09 +0100
commitef06ff43a14fd016d271c491bd830823ee96b740 (patch)
tree5938555ed4b9d317c7c7bad95fe400dc69f0b7c0 /embassy-stm32/src/usart
parentc87051eecb50b80114c69cedc71ed9e3fcd7bb45 (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.rs37
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