完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
通常我们在设计串口协议的时候会有几种规格:
一、包头+长度+数据+校验位+包尾 二、数据+rn 三、数据 对于第一、第二种处理起来非常容易,直接采用串口接收中断即可,如果觉得效率不够高,那么就让串口接收中断+DMA的方式来处理,给CPU减负。 之前也写过类似的文章: stm32f429 HAL库处理串口接收–如何接收带rn的串口数据 对于第三种,也就是不带包头、包尾的,只有数据,这种我们之前没有介绍过,在我看来它的设计有些不太合理,但在数据量不大的情况下,确实也可以这么做,STM32 HAL提供了串口空闲中断+DMA的方式来处理,在数据量较大且容易出错的情况下,建议还是采用自定义协议的方式去处理。 空闲中断+DMA具体实现思路如下: 1、在初始化的时候即开启DMA接收 __HAL_UART_ENABLE_IT(&huart5, UART_IT_IDLE);2、在中断服务函数中判断空闲中断标志,一旦触发了空闲中断标志,此时表示数据已经接收完成了,这时候要关DMA接收,等到下一次我们需要接收的时候再开启接收即可。 //停止DMA接收HAL_UART_DMAStop(&huart5);//开启DMA接收HAL_UART_Receive_DMA(&huart5, (uint8_t*)USART5_RX_BUF, USART_REC_LEN);处理空闲中断服务函数: void UART5_IRQHandler(void){ /* USER CODE BEGIN UART5_IRQn 0 */ //开启uart5空闲中断接收 if(RESET != __HAL_UART_GET_FLAG(&huart5, UART_FLAG_IDLE)) { __HAL_UART_CLEAR_IDLEFLAG(&huart5); HAL_UART_DMAStop(&huart5); }}如上代码示例,当我们开启了DMA接收,当触发了空闲中断以后,我们就可以将USART5_RX_BUF这里面的数据取出来,如果要继续接收,那就再重新开启DMA接收即可。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1936浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
729浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
569浏览 3评论
594浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
552浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 21:42 , Processed in 0.718784 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号