使用STM32 新建了一个DMA空闲中断收不定长度数据,能收到。 想把收到的数据传回收到的数据,但发现:
1,如图片1,if(recv_end_flag==1) //判断标志位
{
HAL_UART_Transmit_DMA(&huart1, rxbuffer1,rxlen);
HAL_Delay(5);
rxlen=0;
recv_end_flag=0; //清除标志位
memset(rxbuffer1,0x00,sizeof(rxbuffer1)); //清空数组
}
在HAL_UART_Transmit_DMA(&huart1, rxbuffer1,rxlen); 后必须增加延时,如果延时5ms,则返回的数据与收到的数据不一致,
2,如果延时增长到30ms,则返回的数据正确。如图2,
3,但如果直接在: USART1_IRQHandler(void)中,直接调用回调函数,回调函数中 "HAL_UART_Transmit_DMA(&huart1, rxbuffer1,rxlen);//将接收到的不定长数据发送到上位机" 这个后面没有延时,就能把 数据全部上传, 问题:为什么回调函数中,使用DMA回传数据可以不用延时?
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 */
if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)) //判断idle标志被置位
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
HAL_UART_DMAStop(&huart1); // 停止DMA传输
rxlen = BUFFER_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); //总计数减去未传输的数据个数,得到已经接收的数据个数
recv_end_flag=1; //一帧数据接收完成标志
USAR_UART_IDLECallback(&huart1,rxlen); // 调用用户定义空闲中断回调函数
}
/* USER CODE END USART1_IRQn 1 */
}
void USAR_UART_IDLECallback(UART_HandleTypeDef *huart,uint8_t rxlen ) //回调函数
{
if(huart == &huart1) //判断是否为串口1产生中断
{
HAL_UART_Transmit_DMA(&huart1, rxbuffer1,rxlen);//将接收到的不定长数据发送到上位机
rxlen = 0;//清除数据长度计数
HAL_UART_Receive_DMA(&huart1,rxbuffer1,BUFFER_SIZE);//重新打开DMA接收
}
}
|