cubemx使用dma实现Uart不定长数据接收

CubeMx版本:

 

volatile uint8_t recv_end_flag=0;
volatile uint32_t rx_len =0;
volatile uint32_t rx_len2 =0;
uint8_t  rx_buffer[BUFFER_SIZE]={0};
uint8_t  rx_buffer2[BUFFER_SIZE]={0};

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
    uint32_t tmp_flag = 0;
    uint32_t temp;

    if(USART1 == huart1.Instance)
    {
      tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //»ñÈ¡IDLE±ê־λ
      if((tmp_flag != RESET))//idle±êÖ¾±»ÖÃλ
      {
          recv_end_flag = 1;  // ½ÓÊÜÍê³É±ê־λÖÃ1
          __HAL_UART_CLEAR_IDLEFLAG(&huart1);//Çå³ý±ê־λ
          HAL_UART_DMAStop(&huart1); //
          temp    =  __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// »ñÈ¡DMAÖÐδ´«ÊäµÄÊý¾Ý¸öÊý
          rx_len =    BUFFER_SIZE - temp; //×ܼÆÊý¼õȥδ´«ÊäµÄÊý¾Ý¸öÊý£¬µÃµ½ÒѾ­½ÓÊÕµÄÊý¾Ý¸öÊý
          memcpy(rx_buffer2,rx_buffer,rx_len);
         
          rx_len2 =rx_len;
          rx_len=0;//Çå³ý¼ÆÊý
      }
    }

  /* USER CODE END USART1_IRQn 1 */
}

uint16_t rx_size=0;
if(recv_end_flag ==1)
{
for(uint16_t i=0;i<rx_len2;i++)
{
if(rx_buffer2[i] == '\0' || rx_buffer2[i] == 0x0d || rx_buffer2[i] == 0x0a)
break;
rx_size++;
}
printf("rx_size=%d\r\n",rx_size);//´òÓ¡½ÓÊÕ³¤¶È
HAL_UART_Transmit(&huart1,rx_buffer2,rx_size,200);//½ÓÊÕÊý¾Ý´òÓ¡³öÀ´

rx_len2=0;//Çå³ý¼ÆÊý
recv_end_flag=0;//Çå³ý½ÓÊÕ½áÊø±ê־λ
memset(rx_buffer2,'\0',BUFFER_SIZE);
HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//ÖØÐ´ò¿ªDMA½ÓÊÕ
}

 

 

posted @ 2024-03-27 10:21  njit-sam  阅读(86)  评论(0)    收藏  举报