I use this method,
never miss abyte, make your buffer 1024bytes at least,
uint32_t U1RxBufferPtrIN =0;
uint32_t U1RxBufferPtrOUT =0;
void initUart1RxDMABuffer(void) {
if (HAL_UART_Receive_DMA(&huart1, (uint8_t *)Usart1RxDMABuffer, U1RxBufSize) != HAL_OK)
{
sprintf(string, "initUart1RxDMABuffer Failed\n");
puts1(string);
}
else
{
sprintf(string, "initUart1RxDMABuffer OK!\n");
puts1(string);
}
}
char peekRxU1(int offset) {
// offset of zero returns the next byte to be read
int relativePtr = (U1RxBufferPtrOUT + offset) & (U1RxBufSize - 1);
char PeekRx = Usart1RxDMABuffer[relativePtr]; // just looking Don't increment pointer
return PeekRx;
}
char readU1(void) {
char readByte = Usart1RxDMABuffer[U1RxBufferPtrOUT++];
if (U1RxBufferPtrOUT >= U1RxBufSize) U1RxBufferPtrOUT = 0;
return readByte;
}
char readableU1(void) {
U1RxBufferPtrIN = U1RxBufSize - huart1.hdmarx->Instance->CNDTR;
return U1RxBufferPtrIN - U1RxBufferPtrOUT;
}
void clearRxBuffer(void) {
U1RxBufferPtrIN = U1RxBufSize - huart1.hdmarx->Instance->CNDTR;
U1RxBufferPtrOUT = U1RxBufferPtrIN;
}