June牛
发表于 2017-4-5 15:17:25
谢谢!真心对我很有用啊!
yygkqzh
发表于 2017-5-3 20:51:46
多谢分享,学习了
zdx
发表于 2017-5-24 16:45:37
Thanks!
lynnxie
发表于 2017-5-28 23:00:52
非常感谢楼主的方法,非常好用
如果在一次性接收的数据包比较大,大于设定的DMA接收Buf,用空闲中断则会丢掉之前的一整帧,对吧,这个问题如何解决呢?
jazu
发表于 2017-6-1 18:03:32
lynnxie 发表于 2017-5-28 23:00
非常感谢楼主的方法,非常好用
如果在一次性接收的数据包比较大,大于设定的DMA接收Buf,用空闲中断则会丢 ...
缓冲区要设置超过可能存在的最大数据包
星辰一方
发表于 2017-6-1 18:32:26
空闲中断很有用,分享很赞!
张亚飞
发表于 2017-6-1 18:43:04
对DMA的实时性好奇,以及中断优先级对DMA传输有没有影响,还有适用多大内存的片子
jtc_88
发表于 2017-6-2 11:28:17
这个 需要配合 串口数据 收发 协议来,否则无法确认 到底接收多少数据。
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) == (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 禁止 时 重新写入
}
胡图图啊
发表于 2017-8-23 09:47:50
救我一个发现了吗??接收的第二个数据覆盖不了第一个。也就是说第一次接收1234,第二次你发送12它还是显示1234.好气啊:(
dongchenyu163
发表于 2017-11-14 11:50:28
很好的教程,支持一下楼主