完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
首先定义一些变量
uint8_t rx_len=0; uint8_t recv_end_flag=0; uint8_t rx_buffer[200]; 然后在串口初始化之后添加IDLE中断相关函数 __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//开启IDLE中断 while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)==RESET) {} HAL_UART_Receive_DMA(&huart1,rx_buffer,200);//开启DMA接收 recv_end_flag=0; 串口中断函数 void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ uint32_t tmp_flag = 0; uint32_t temp; tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); if((tmp_flag != RESET)) { __HAL_UART_CLEAR_IDLEFLAG(&huart1); temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); HAL_UART_DMAStop(&huart1); rx_len = 200 - temp; recv_end_flag = 1; } /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */ } 串口中断函数中,清除中断,获取接收到的长度,置接收完成标志recv_end_flag=1 while函数中判断recv_end_flag进行处理 while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(recv_end_flag ==1) { printf("接收到的数据长度为%drn",rx_len); HAL_UART_Transmit(&huart1,rx_buffer, rx_len,200);//将接收到的数据发送出去 for(uint8_t i=0;i rx_buffer=0;//清空 } rx_len=0;//清0 recv_end_flag=0;//清0 HAL_UART_Receive_DMA(&huart1,rx_buffer,200); } } 以上完成了串口IDLE+DMA接收不定长数据 但是实际调试中发现一个问题,串口初始化完毕,使能IDLE中断,开启DMA接收,会产生一次IDLE中断,程序会进入中断处理函数,置位recv_end_flag,进入while后便会串口打印出:接收到的数据长度为0, 就是说初始化过程之后,会进入一次IDLE中断,在网上看到一篇类似文章找出了解决办法 http://news.eeworld.com.cn/mcu/2015/1029/article_23375.html 就是说UART会发送一个空闲帧,猜想初始化进入IDLE中断也许与此类似 便添加了 while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)==RESET) {} 或者使用延时函数进行一段延时也可以 等待IDLE标志位清0,不过,依然会进入中断,后面需要将recv_end_flag=0,这样程序可以正常的接收不定长数据,不会出现上电复位,第一次就打印接收数据长度为0。 (解决办法是:这样还是会进中断,通过recv_end_flag=0,解决第一次打印问题) 另外接收不定长数据页可以使用定时器进行不定长接收 大概流程是:串口接收到数据后,开启定时器,将接收到的数据存储起来,定时器大概定3ms左右的定时,每次进入串口中断,定时器清0 ,当完成一帧接收,不再进入中断,定时器产生中断,然后置flag值,while函数判断flag值执行相关操作(之前使用STM8弄过一次) 在使用SMT32F103和STM32F412过程中没有出现过上电复位就进入IDLE中断的现象。(猜测STM32H750_400M频率,SMT32F103_72M,H750代码执行的更快,使用__HAL_UART_GET_FLAG获取IDLE的状态,H750会出现1,而F103没有,猜测要么可能与HAL底层的库的问题,要么可能与硬件电路有关,或者就是与空闲帧有关) 或者应该在接收之后打开空闲中断,具体没去试过。 MY_QuinTA的笔记 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1115 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1140 浏览 1 评论
572 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
428 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1026 浏览 2 评论
1614浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
281浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
291浏览 3评论
276浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
253浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-20 20:45 , Processed in 0.826627 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号