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),假设发送端传两段数据间隔很短,那么这边接收的数据还没开始处理,又被接收的数据给充掉了,有这可能吗? |