OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5247|回复: 6

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

[复制链接]

9

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-3-11
在线时间
74 小时
发表于 2017-10-20 00:38:12 | 显示全部楼层 |阅读模式
1金钱
芯片为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++;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-3-11
在线时间
74 小时
 楼主| 发表于 2017-10-20 00:45:55 | 显示全部楼层
附上仿真时的DMA数组正常和异常的对比

正常的DMA数组

正常的DMA数组

出问题的DMA数组

出问题的DMA数组
回复

使用道具 举报

91

主题

186

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2016-3-22
在线时间
122 小时
发表于 2017-10-20 08:18:22 | 显示全部楼层
我用串口DMA发送数据出去,40帧每秒的数据发送,有时候两个数据包中间间隔特别短,相当于一帧,而且串口发送输出出去每一帧之间的间隔不一样有大有小,到现在还没有解决
回复

使用道具 举报

338

主题

385

帖子

0

精华

QQ游客

积分
1254
金钱
1254
注册时间
2016-12-9
在线时间
56 小时
发表于 2017-10-26 10:12:05 来自手机 | 显示全部楼层
那个间隔可以设置吗
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-17
在线时间
4 小时
发表于 2019-8-16 15:20:47 | 显示全部楼层
kaxilion 发表于 2017-10-20 00:45
附上仿真时的DMA数组正常和异常的对比

楼主这个问题解决了吗?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-1-2
在线时间
6 小时
发表于 2020-1-7 14:31:15 | 显示全部楼层
同问,楼主问题怎么解决的。
回复

使用道具 举报

17

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2018-12-28
在线时间
39 小时
发表于 2020-1-8 08:54:35 | 显示全部楼层
就是因为NORMAL模式接收,只收一次,但是因为你开数组的长度有点长,所以DMA必须等填满接收个数才会关闭
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-11 13:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表