你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
lynnxie 发表于 2017-5-28 23:00 非常感谢楼主的方法,非常好用 如果在一次性接收的数据包比较大,大于设定的DMA接收Buf,用空闲中断则会丢 ...
多谢分享,学习了
如果在一次性接收的数据包比较大,大于设定的DMA接收Buf,用空闲中断则会丢掉之前的一整帧,对吧,这个问题如何解决呢?
缓冲区要设置超过可能存在的最大数据包
HAL_UART_Receive_DMA(&huart1, RX_DATA, RX_DATA_NUM);
__HAL_DMA_DISABLE_IT(huart1.hdmarx, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE);//关闭DMA 错误 传输一半 全部完成 中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能 串口 空闲中断
HAL_NVIC_SetPriority(USART1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn); //使能中断
void USART1_IRQHandler(void)
{
if((__HAL_DMA_GET_COUNTER(huart1.hdmarx) + RX_DATA[3]) == (RX_DATA_NUM - 6))
{
Flag_RX = 1;
}
__HAL_UART_CLEAR_IT(&huart1, UART_CLEAR_IDLEF);
__HAL_DMA_DISABLE(huart1.hdmarx);
huart1.hdmarx->Instance->CNDTR = RX_DATA_NUM;
__HAL_DMA_ENABLE(huart1.hdmarx); //DMA接收数据 必须在 DMA 禁止 时 重新写入
}