stm32串口怎么用DMA接收不定长数据,求大神点播

LYuer_ 2018-07-11 08:48:33
stm32串口怎么用DMA接收不定长数据,求大神点播
1. 网上查到,空闲中断+DMA可以接收不定长数据,但是看了好多,只是知道空闲中断里面可以得到缓存器剩余数据量,从而可以求出已经接收的数据量。然后就没了,那么怎么实现不定长接收呢?
2. 缓存区并不能从头刷新,比如说,9个数据量的缓存,我传4个数,那么我下次传6个,这时候缓存器并不能从新从第一位开始刷新,而是接着存储,然后数据就乱了,所以并没有实现不定长接收。我想要不管传输多长字节都可以让缓存区从头开始缓存,这样并不知道怎么实现期待大神

3. 或者说我的思路是错的,DMA接收不定长数据应该用别的方式,有懂的大神帮忙说一下
...全文
1015 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
slience_lei 2021-03-23
  • 打赏
  • 举报
回复
您好,我现在也遇到这个问题了,接收不定长数据总是没清缓存呢?重新开了也不行。
LYuer_ 2018-08-14
  • 打赏
  • 举报
回复
这个问题,我自己搞懂了,贴出来给大家分享。
DMA+空闲中断可以实现不定长数据接收。实现不定长接收原理是当进入空闲中断时(进入空闲中断即表示已经传输完成一帧数据),在空闲中断里关闭再重新开启DMA,这样DMA缓存即使没有满,也会重新开始,这样就实现不定长的接收了。在上面的空闲中断里读取每次接收到的数据并处理就可以了。有一点要注意:DMA的模式要设置为循环模式。
remeber6666 2018-07-17
  • 打赏
  • 举报
回复
1 DMA收发数据不一定非要用中断吧?DMA本身就是和程序无关的,设置好了硬件自动传输。
2 首先你确定不定长数据最大可能长度,按这个长度设置数据长度。然后,DMA读取时用SR寄存器空标志控制。
另外,数据传输顺序的问题,不知道你用的是数组还是指针,一般来说都没有问题,传输的时候要用地址控制。指针方便些。
3 如果数据太大,你有必要用外部存储器
hold-ln 2018-07-16
  • 打赏
  • 举报
回复
1.进入空闲中断后,先关闭DMA
2.读取数据长度,
3.重新设置重新设置DMA传输数据数量
4.开启DMA
if(USART_GetITStatus(USART6, USART_IT_IDLE) != RESET)//如果为空闲总线中断
{
USART_ReceiveData(USART6);
USART_ClearITPendingBit(USART6, USART_IT_IDLE);
DMA_Cmd(DMA2_Stream2, DISABLE);//关闭DMA,防止处理其间有数据
usart6_dma_receive_len = USART6_DMA_RCE_MAX_LENGHT - DMA_GetCurrDataCounter(DMA2_Stream2); //数据长度
usart6_dma_receive_flg = 0x01;
DMA_SetCurrDataCounter(DMA2_Stream2, USART6_DMA_RCE_MAX_LENGHT); //重新设置DMA传输数据数量
DMA_Cmd(DMA2_Stream2, ENABLE);//开启DMA
}
LYuer_ 2018-07-12
  • 打赏
  • 举报
回复
你这个说法是不对的
worldy 2018-07-11
  • 打赏
  • 举报
回复
串口就是串口,串口不能使用DMA传输的,DMA传输要求部件能接管CPU的总线

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧