分享一个使用使用HAL库实现串口收发不定长数据的方法,芯片为STM32F103C8T6,使用STM32CubeMX配置硬件参数,下面泛米米博客介绍详细方法。
STM32串口收发不定长数据原理:
在一帧数据传输结束后,通信线路会维持高电平,当CPU检测到线路处于空闲状态时,空闲状态标志IDLE将由硬件置1。如果串口控制器CR1中的IDLEIE位为1,将触发空闲中断,也就是IDLE中断,这里实现收发不定长数据就是利用的这个中断。
STM32串口收发不定长数据的目标:
利用串口助手,从PC发送任意长度的字符到STM32F103C8T6核心版串口,收到数据后将原样返回到PC端串口助手。
STM32串口收发不定长数据的设计思路:
1、使能IDLE中断,在串口中断服务程序中添加对IDLE的判断。
2、启动DMA,将接收的数据缓存,当一帧数据发送完成后,线路厨余IDLE空闲状态,会触发IDLE中断,在IDLE中断回调函数里设置接受完成标志。
3、WHILE里检测到接收完成标志后,将接受的一帧数据原样发回,重新启动DMA。
完整版源码网盘下载连接:
https://url98.ctfile.com/f/20967998-507762658-80b652
(访问密码:4565)
压缩包内容:包含源码,视频教程
有问题需要技术支持或者stm32开发可以添加泛米米微信:2370202521
STM32串口收发不定长数据具体步骤:
1、用STM32CubeMX配置参数
这里主要是配置下串口,然后生成项目文件即可。
2、打开项目文件,编写用户代码。
a、添加空闲中断的处理。
void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ //添加IDLE中断处理 if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)!= RESET) //是否发生IDLE { __HAL_UART_CLEAR_IDLEFLAG(&huart1); //清除IDLE中断标志 HAL_UART_IdleCpltCallback(&huart1); //用户编写的IDLE中断回调函数 } /* USER CODE END USART1_IRQn 1 */ }
b、添加用户变量以及宏定义。
/* USER CODE BEGIN PV */ uint8_t RxBuffer[LENGTH]; //接收缓存区 uint8_t RecCount = 0 ; //接收数据个数 uint8_t RxFlag = 0 ; //接收完成标志:0表示接收未完成,1表示接收完成 /* USER CODE END PV */
c、添加while代码,判断接受完成标志,将数据发回
/* USER CODE BEGIN 3 */ if(RxFlag == 1) //判断数据是否接收完成 { RxFlag = 0; //清除标志位 //发生空闲中断时,已接收数据个数等于数据总量减去DMA数据流中待接收的数据个数 RecCount = LENGTH - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); //采用DMA方式将接收的数据原样发回PC HAL_UART_Transmit_DMA(&huart1,(uint8_t*)RxBuffer,RecCount); RecCount = 0; HAL_UART_Receive_DMA(&huart1,(uint8_t*)RxBuffer,LENGTH); //启动DMA接收 } } /* USER CODE END 3 */
d、添加中断回调函数和空闲中断函数
/* USER CODE BEGIN 4 */ //***********接收中断回调函数***************// //DMA中断将调用接收中断回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart ->Instance == USART1) { //重新启动DMA接收,准备下一次的数据传输 HAL_UART_Receive_DMA(&huart1,(uint8_t*)RxBuffer,LENGTH);//使能接收终端 } } //*************空闲中断回调函数********************// void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart) { RxFlag = 1; //设置接收完成标志 } /* USER CODE END 4 */
程序就完成了,然后编译,0错误0警告,下载,测试串口
发送任意长度数据,正常返回任意长度数据。
完成。
视频教程:微信扫下面二维码,或者搜视频号“泛米米”即可查看
有问题需要技术支持可以添加泛米米微信:2370202521
关于STM32F103C8T6使用STM32CubeMX配置参数生成HAL库,利用DMA空闲中断IDLE实现串口收发不定长数据的方法,提供源码泛米米博客就介绍到这了。
欢迎关注微信公众号:泛米米
12本阳台种菜电子书限时免费送
关注【泛米米】,发送“电子书”免费获取
随时随地在手机上学习交流阳台种菜
这篇文章出自 fanmimi 如需转载请注明出处;
这篇文章的地址:https://fanmimi.com/2021/490.html
本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!