stm32 串口2空闲中断死机_利用stm32串口空闲中断接收不定长数据

本文介绍了如何利用STM32的串口空闲中断来接收不确定长度的数据,避免了传统中断模式下的效率低和丢数据问题。通过自定义中断处理函数user_Uart1Handler(),在接收第一个字节后开启空闲中断,当进入空闲状态时关闭接收中断,从而确保接收到完整的一帧数据。这种方法提高了串口通信的效率。
摘要由CSDN通过智能技术生成

在做项目中,stm32的串口应用常用来作为单片机和模块之间的通信。比如单片机和gsm模块通信,单片机和gps模块的通信。那么和这些模块就用到了串口的协议解析。那么问题来了,现在基于stm32的Hal库把串口接收函数进行了封装,不管是非中断模式,中断模式,还是dma模式都是接收固定数量byte的数据。但是在协议处理的过程中单片机很多时候是不知道模块发过来的数据是有多少byte的。

我之前大部分做的时候是用中断来一个数据接收一个数据放在缓冲区,然后过一个时间片段进行分析接收到的数据。但是这种模式效率低下,还可能有丢数据的风险。最近在调试一个串口协议程序,看stm参考手册发现一个以前没有去关注过的空闲中断,觉得这个可以大大的派上了用场。随即在百度上进行了搜索,原来已经有很多小伙伴这样用过。但是在网上的资料往往都是千篇一律,一篇文章被转过来转过去。基本上都是空闲中断加DMA的方式来操作。

我后来自己实践了,不需要dma,只用空闲中段加接收完成中段就可以完成接收一帧不定长的数据。

我试验的平台是stm32F407,其他stm32型号都类似。基于hal库的封装还是很统一的。使用stm32cubemx进行配置。串口配置很简单,如下:

打开串口

配置串口参数:

打开串口中断:

其他配置的我就不啰嗦了,然后生成mdk工程。在mdk中我们就重点看下stm32Fxxx_it.c文件中关于串口中断这块代码

void USART1_IR

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值