用cubemx+DMA+空闲中断接收不定长数据

1、用CUBEMX生成初始化代码的时候,DMA的mode要设置为normal(即默认值),注意要开启中断。

2、空闲中断:空闲中断位于文件 stm32f1xx_it.c 中,名字类似于void UARTX_IRQHandler(void) 。这个空闲中断的产生时机是接收到了数据就触发(接收数据的数组没有满也可以触发)。

3、在空闲中断里面编写自己的回调函数,不用自动生成的 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 函数了(因为这个回调函数需要数组接收满才触发)。

4、自己的回调函数里面可以用for循环判断‘\0’元素来获取接收数据的实际大小,然后处理数据。

5、处理完数据之后用 memset(void * /*s*/, int /*c*/, size_t /*n*/)函数清空数组(例:memset(&uart4_recive_data,0,sizeof(uart4_recive_data));),该函数在string.h头文件中。

6、清空完数组就要stop DMA,再开启DMA接收。(stopDMA是为了让下一次接受的时候数据会从接收数组的首地址开始存储)。

posted @ 2018-07-26 10:54  sovagxa&静默  阅读(2291)  评论(0编辑  收藏  举报