- void UsartReceive_IDLE(UART_HandleTypeDef *huart,UartBufferTypedef *UartxRT )
- {
- uint32_t temp;
- if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET)) //获取IDLE标志位,如果idle标志被置
- {
- __HAL_UART_CLEAR_IDLEFLAG(huart); //清除标志
- HAL_UART_DMAStop(huart);
- temp=__HAL_DMA_GET_COUNTER(huart->hdmarx); //获取DMA中未传输的数据个
- UartxRT->RxLen = MAX_UART_BUFFER - temp; //总计数减去未传输的数据个数,得到已经接收的数据个
- memcpy(UartxRT->RxBuf ,UartxRT->RxDMA_Buf ,UartxRT->RxLen );
- UartxRT->rx_idle_flag=1; //接受完成标志位置1
- HAL_UART_Receive_DMA(huart,UartxRT->RxDMA_Buf,MAX_UART_BUFFER); //重新启串口DMA接收
- }
- }
- void DMA1_Channel5_Receive_Complete(UART_HandleTypeDef *huart,UartBufferTypedef *UartxRT)
- {
- static uint8_t witchbuf=1;
- if( __HAL_DMA_GET_FLAG(&hdma_usart1_rx,DMA_FLAG_TC5)!= RESET) //DMA接收完成标志
- {
- __HAL_DMA_CLEAR_FLAG(&hdma_usart1_rx,DMA_FLAG_TC5); //清除中断标志
- HAL_UART_DMAStop(huart);
- if(witchbuf==1) //之前用的buf1,切换为2
- {
- memcpy(UartxRT->RxBuf ,UartxRT->RxDMA_Buf ,MAX_UART_BUFFER);
- UartxRT->rx_idle_flag=1;
- witchbuf=2;
- HAL_UART_Receive_DMA(huart,UartxRT->RxDMA_Buf2,MAX_UART_BUFFER); //重启串口DMA接收到buf2
- }
- else if(witchbuf==2) //之前用的buf2,切换为buf1
- {
- memcpy(UartxRT->RxBuf ,UartxRT->RxDMA_Buf2 ,MAX_UART_BUFFER);
- UartxRT->rx_idle_flag=1;
- witchbuf=1;
- HAL_UART_Receive_DMA(huart,UartxRT->RxDMA_Buf,MAX_UART_BUFFER); //重启串口DMA接收到buf1
- }
- }
- }
@xyz549040622 以上这样写,好像每次收完复制到一个地方,会很慢吧。是不是应该传递指针?不复制又容易丢
|