分享一个使用使用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://www.fanmimi.com/2021/490.html
本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!
长沙电动车自行车上牌app下载地址和二维码,长沙电动自行车上牌全部75个网点地址(包括社区网点)
分享一个免费看vip视频的app,可以免费看各大视频网站的vip视频内容,比如免费看优酷VIP视频,免费看腾讯VIP视频,免费看爱奇艺vip视频,芒果TV的VIP视频等
淘客手淘群api建群及api发单审核通过没有在哪里查看?版本
百度加队伍天天瓜分红包口令、二维码,百度集卡换卡QQ群,百度app组队天天瓜分红包,百度独家冠名春晚,撒9亿红包,1千万个20.19元
使用AD画板子原理图导入PCB时,所有元器件都有白色网状怎么去掉?
使用百度云LBS生成麻点图显示自定义数据的教程
600位妈妈精心整理史上最全最实用待产包清单+育儿知识(2016最新)[导航首页]
宝宝日用系列--2016最新最全最实用待产包清单(10)