串口接收DMA快速连续接收两帧数据误以为一帧

2019-07-20 11:20发布

芯片为F407;功能:串口空闲中断+串口DMA接收实现不定长度的数据接收

测试方法:用串口助手每20ms发送10字节的数据到MCU
现象:发送间隔大于20ms时,每帧数据都是完好接收的,DMA的数组也看到数据长度和内容和PC发送的一致,但如果发送间隔少于20ms,不停接收的过程中DMA的数组连续接收了两倍数据的长度(就是连续接收了20个字节,10字节重复了两遍)
分析:空闲中断进来后我把数组读完后把DMA已经关掉了,还做了检测,按道理来说关掉了再开不是应该数据从第一位开始重新接收了么?现象感觉就是DMA没关掉,在接收了两次数据才关掉的样子....求各位大大指导下哈,以下为代码部分。

中断部分:
void USARTx_IRQHandler(void)
{
        if(USART_GetITStatus(USARTx, USART_IT_IDLE) != RESET)
        {
                USARTx->SR;
                USARTx->DR;//请空闲标志
               
                DMA_Cmd(USARTx_RX_DMA_STREAM, DISABLE);
                while (DMA_GetCmdStatus(USARTx_RX_DMA_STREAM) != DISABLE)//确保关闭DMA
                {
                }
                DMA_ClearFlag(USARTx_RX_DMA_STREAM, USARTx_RX_DMA_FLAG_TCIF);//清除DMA标志

                Uartx_GetData(&g_tUartx);//提取数据

                DMA_SetCurrDataCounter(USARTx_RX_DMA_STREAM, BUFFERSIZE);//重新设置长度
                DMA_Cmd(USARTx_RX_DMA_STREAM, ENABLE);//DMA再开
        }
}


void Uartx_GetData(UART_S*_pUart)
{
        uint8_t len = 0;
        uint8_t i = 0;
        len = BUFFERSIZE - DMA_GetCurrDataCounter(USARTx_RX_DMA_STREAM);//读取数据长度.......这个地方出问题时长度的确变成了两倍甚至三倍
       
        //下面都是数据提取,由于环形数组接收,所以做了数据分段复制的处理
        if ((_pUart->usRxWrite + len) > _pUart->usRxBufSize)
        {
                memcpy(&(_pUart->pRxBuf[_pUart->usRxWrite]),aRxBuffer,_pUart->usRxBufSize-_pUart->usRxWrite);       
                memcpy(_pUart->pRxBuf,&aRxBuffer[_pUart->usRxBufSize-_pUart->usRxWrite],len-(_pUart->usRxBufSize-_pUart->usRxWrite));
                _pUart->usRxWrite = _pUart->usRxWrite + len - _pUart->usRxBufSize;
        }
        else
        {
                memcpy(&(_pUart->pRxBuf[_pUart->usRxWrite]),aRxBuffer,len);
                _pUart->usRxWrite = _pUart->usRxWrite + len;
        }
        _pUart->usRxCount++;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。