打印

关于STM32CUBE 串口 DMA 问题请教

[复制链接]
444|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
菊江先生|  楼主 | 2020-4-25 21:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、关于DMA固定长度接收,只能接少于指定长度的数据,而且少于指定长度数据也不产生中断,满了才中断,如果固定收20个字符,另一边一次连续发送30个,就是会丢失10个,不知我理解的对不对,把固定长度设成比实际一次连续传输数据大是可以接收全数据的,我是新手,大家是怎么处理的?

看了关于不定长DMA空闲接收方式,下列程序段:

void UsartReceive_IDLE(UART_HandleTypeDef *huart)  
{  
    uint32_t temp;  

    if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))  
    {   
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);  
        HAL_UART_DMAStop(&huart1);  
        temp = huart1.hdmarx->Instance->CNDTR;  
        UsartType.RX_Size =  RX_LEN - temp;   
        UsartType.RX_flag=1;  
        HAL_UART_Receive_DMA(&huart1,UsartType.RX_pData,RX_LEN);  
    }  
}  
这里的定义的Size赋给了DMA_SxNDTR。使能之后,只能读取,表示还有多少字节需要被“传送”。所以空闲中断里面
temp  = hdma_usart1_rx.Instance->CNDTR;  //读取还没有被传送的个数            
rx_len =  BUFFER_SIZE - temp;                    //DMA缓存大小减去没有被传送的个数,就等于已经被传送的个数,也就是接收到的个数。
所以感觉如果是DMA接收,即使外部过来的数据个数不等于设定的Size,那么数据也还是被接收到了指定的buffer中。

2、看了关于不定长DMA接收方式,测试也是可行,就是有点不理解的是,在串口中断接收完成后,最行一行代码,又开始立即接收,HAL_UART_Receive_DMA(&huart1,UsartType.RX_pData,RX_LEN),假设发送端传两段数据间隔很短,那么这边接收的数据还没开始处理,又被接收的数据给充掉了,有这可能吗?

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

447

帖子

0

粉丝