@@ -565,24 +565,30 @@ impl<'d> BufferedUartRx<'d> {
565
565
poll_fn ( move |cx| {
566
566
let state = self . state ;
567
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
- let len = data. len ( ) . min ( buf. len ( ) ) ;
572
- buf[ ..len] . copy_from_slice ( & data[ ..len] ) ;
571
+ while !data. is_empty ( ) && buf_len < buf. len ( ) {
572
+ let data_len = data. len ( ) . min ( buf. len ( ) - buf_len) ;
573
+ buf[ buf_len..buf_len + data_len] . copy_from_slice ( & data[ ..data_len] ) ;
574
+ buf_len += data_len;
573
575
574
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
579
if do_pend {
578
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 ( ) ) ;
585
- Poll :: Pending
586
+ if buf_len != 0 {
587
+ Poll :: Ready ( Ok ( buf_len) )
588
+ } else {
589
+ state. rx_waker . register ( cx. waker ( ) ) ;
590
+ Poll :: Pending
591
+ }
586
592
} )
587
593
. await
588
594
}
@@ -591,21 +597,24 @@ impl<'d> BufferedUartRx<'d> {
591
597
loop {
592
598
let state = self . state ;
593
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 ( ) {
597
- let len = data. len ( ) . min ( buf. len ( ) ) ;
598
- buf[ ..len] . copy_from_slice ( & data[ ..len] ) ;
603
+ while !data. is_empty ( ) && buf_len < buf. len ( ) {
604
+ let data_len = data. len ( ) . min ( buf. len ( ) - buf_len) ;
605
+ buf[ buf_len..buf_len + data_len] . copy_from_slice ( & data[ ..data_len] ) ;
606
+ buf_len += data_len;
599
607
600
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
611
if do_pend {
604
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
0 commit comments