AFAIK there is no similar function in HAL. The common way to do it is:
// index of first unread byte in the RX buffer
static uint32_t rxpos = 0;
// find end of data position in the RX buffer
uint32_t pos = rxsize - puart->hdmarx->Instance->CNDTR;
// pass accumulated bytes to listener
if (pos != rxpos) {
if (pos > rxpos) {
// Process data directly by subtracting indexes
processData(rxbuffer + rxpos, pos - rxpos);
} else {
// First process data to the end of the buffer
processData(rxbuffer + rxpos, rxsize - rxpos);
// Continue with beginning of the buffer
processData(rxbuffer, pos);
}
}
// update starting index
rxpos = (pos == rxsize)? 0 : pos;
You can call the above code from HAL_UART_RxHalfCpltCallback, HAL_UART_RxCpltCallback and, if you have code for processing either IDLE or RTO events, from corresponding handlers as well.
Note that current HAL implementation treats RTO as an error, eliminating the possibility to handle it properly. You'd have to bypass that if you want to get circular DMA transfers handled without added latency.