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½ÓÊÕ
	}
 
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号