[STM32F1] STM32的HAL库实现串口的不定长数据接收

[复制链接]
2703|26
 楼主| clokyme 发表于 2021-12-31 14:08 | 显示全部楼层 |阅读模式
本帖最后由 clokyme 于 2021-12-31 14:08 编辑

#申请原创#前言:
在使用STM32HAL库进行串口通信的时候发现不论使用轮询、中断或DMA接收方式都只能接收固定长度的数据,但是在实际使用的过程中我们需要接收不定长的数据,那是否意味我们无法使用HAL库了呢?是否需要重新构建自己的接收函数吗?答案是否定的,我们依然可以直接使用HAL库中封装好的函数,我们只需利用串口的空闲中断来实现接收不定长的数据,但是HAL库中没有IDLE中断的服务函数,为此我们只需自己构建一个IDLE中断的服务函数即可。
实现步骤:
  • 建立工程
  • 打开CubeMX软件,根据自己的硬件选择对应的芯片型号,建立CubeMX工程。然后配置调试接口,这里需要根据自己硬件的调试口选择是SWD还是JTAG接口,然后配置系统时钟,根据硬件选择是否使用外部晶振,配置时钟树。


4855361c57bd329f3b.png 1847461c57efb919ac.png 7528461c57f580b76b.png 785061c57f7c8d542.png

2.配置串口通信相关参数,主要设置通信方式波特率、数据位、校验方式等信息。
7756961c58038a875d.png

3.设置中断优先级,若要使用DMA方式的话需要再额外配置DMA相关信息
775461c581b5db7f3.png 8442761c581cf08263.png
3.配置好上述信息后就可以配置工程的最后一些信息,即可生成工程和代码,此处我选择生成IAR工程,也可以选择生成MDK的工程,看自己的需求了。
160161c582f308d63.png
  • 添加用户代码,实现不定长数据接收

9298061c587dcf0a92.png
添加中断回调服务函数
4497461c58dc15e251.png
然后再在主函数中将接收到的数据简单的发出去。上述修改完成后就实现了我们使用HAL库接收不定长数据的功能了。
6472861c58e02a3b47.png

整个工程代码如下。



8886161c57f57313db.png
7875261c581d22a934.png

com.zip

1.05 MB, 下载次数: 6

jgp886585 发表于 2021-12-31 15:14 来自手机 | 显示全部楼层
weiwei4dk 发表于 2021-12-31 17:08 | 显示全部楼层
谢谢分享, 不定长接收还是很常用的
kkzz 发表于 2022-1-2 16:27 | 显示全部楼层
用定时器判断不行吗  
hudi008 发表于 2022-1-2 16:30 | 显示全部楼层
在一帧数据尾部添加一个小尾巴  
hudi008 发表于 2022-1-2 16:31 | 显示全部楼层
数组是如何存储  
lzmm 发表于 2022-1-2 16:31 | 显示全部楼层
可以使用环形fifo  
minzisc 发表于 2022-1-2 16:31 | 显示全部楼层
IDLE中断的服务函数是定时器吗   
selongli 发表于 2022-1-2 16:32 | 显示全部楼层
用的dma中断吗   
fentianyou 发表于 2022-1-2 16:32 | 显示全部楼层
我一般用超时判断的。  
xiaoyaodz 发表于 2022-1-2 16:33 | 显示全部楼层
期待自带的idle了   
febgxu 发表于 2022-1-2 16:33 | 显示全部楼层
HAL库中断呢   
sdlls 发表于 2022-1-2 16:34 | 显示全部楼层
串口的空闲中断是什么标志   
pixhw 发表于 2022-1-2 16:34 | 显示全部楼层
定时器判断。   
minzisc 发表于 2022-1-2 16:34 | 显示全部楼层
这个不是通过字符串判断吗  
lzmm 发表于 2022-1-2 16:34 | 显示全部楼层
可以直接使用HAL库中封装好的函数
hudi008 发表于 2022-1-2 16:34 | 显示全部楼层
kkzz 发表于 2022-1-2 16:34 | 显示全部楼层
DMA怎么判断不定长呢?   
febgxu 发表于 2022-1-2 16:34 | 显示全部楼层
使用中断如何判断呢  
xiaoyaodz 发表于 2022-1-2 16:34 | 显示全部楼层
判断idle太麻烦了。  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

44

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部