你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

HAL库串口中断接收不了数据

[复制链接]
癸锋 提问时间:2019-6-16 19:34 /
如题,求救各位大神,我使用stm32cube生成的串口中断程序,现在遇到我用PC的串口助手发送数据可以跳进接收中断函数(见图3),但是却每次都好像没有数据一样跳回主循环。如下面图1,我设置断点,单步到了UART_Receive_IT()下的接收状态判断,然后就被跳转到图2的结束地方,查看变量监控窗口,确实是处于ready状态所有跳不进去处理部分。

小弟有以下几个疑问:
1.按照描述,应该是要当处于rx_busy就是在处理的状态下才能进行处理,但是为什么都已经触发了接收中断了,还是没有改变状态?

2.我如果修改了判断条件,改成ready,处理到if(huart->Init.Parity == UART_PARITY_NONE)部分下就直接跳出到主循环,为什么会产生这个情况?明明只是单纯的赋值而已?
图1.png
图2.png
图3.png
收藏 评论10 发布时间:2019-6-16 19:34

举报

10个回答
癸锋 回答时间:2019-6-17 08:30:22
补充一下,在stm32cube上生成代码的时钟树是默认的8M,生成代码后,只在USART1_IRQHandler()和HAL_UART_MspInit()中添加了                __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);                __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
用来开启串口(不然只能进去一次接收中断函数)。
图4.png
废鱼 回答时间:2019-6-17 08:39:45
出现这个问题的时候,大多数是因为加断点,接收数据发生了溢出导致。建议楼主不要在中断中加断点,HAL库发生这个异常以后,建议重新初始化一下串口。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

癸锋 回答时间:2019-6-17 11:12:13
安 发表于 2019-6-17 08:39
出现这个问题的时候,大多数是因为加断点,接收数据发生了溢出导致。建议楼主不要在中断中加断点,HAL库发 ...

可是我不加断点,在回调函数里面加一个LED翻转判断没有进入回调函数,是什么鬼?
wenyangzeng 回答时间:2019-6-17 11:27:02
本帖最后由 wenyangzeng 于 2019-6-17 11:31 编辑
540429224 发表于 2019-6-17 08:30
补充一下,在stm32cube上生成代码的时钟树是默认的8M,生成代码后,只在USART1_IRQHandler()和HAL_UART_M ...

楼主必须配置系统时钟为72MHZ串口才能够正常通信
无标题.png

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

癸锋 回答时间:2019-6-17 16:15:47
wenyangzeng 发表于 2019-6-17 11:27
楼主必须配置系统时钟为72MHZ串口才能够正常通信

大神,我重新配置了时钟也不行,设定了一个LED翻转语句,在接收中断函数可以被触发,但是在main里面定义的接收回调函数却不可以。我只添加了三个地方的代码,一个在接收中断函数,一个在主函数,一个在串口初始化文件,能不能帮忙看看是遗漏了还是配置错了?谢谢。
主函数重写的接收回调函数.png
串口初始化配置函数.png
接收中断函数.png
Cortexxx 回答时间:2019-6-17 16:36:16
调大一下堆栈试一下吧 D

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

wenyangzeng 回答时间:2019-6-17 16:45:47
540429224 发表于 2019-6-17 16:15
大神,我重新配置了时钟也不行,设定了一个LED翻转语句,在接收中断函数可以被触发,但是在main里面定义 ...

楼主貌似没有开始串口接收:
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, Size);
癸锋 回答时间:2019-6-17 17:00:11
Cortexxx 发表于 2019-6-17 16:36
调大一下堆栈试一下吧 D

怎么调?能指点一下么?
癸锋 回答时间:2019-6-17 17:20:31
wenyangzeng 发表于 2019-6-17 16:45
楼主貌似没有开始串口接收:
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, Size); ...

我在while循环前面加了HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1),变成只能进入一次接收回调函数,我也在接收回调函数里面加了                __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);
                __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
变成可以进入一次回调函数了,之后就再也进不了回调函数,但是可以再进入中断接收函数(我设置了断点可以跳转)。如果receive_IT后面的size参数不是数字而是一个uint16_t的变量,压根就进不了回调函数。
癸锋 回答时间:2019-6-18 19:11:58
找到解决问题点了,在接收回调函数里面还要再次引用HAL_UART_Receive_IT(&huart1,(uint8_t *)RXdata,1)才可以重复进入接收回调函数!!!
对于这次调串口遇到的坑,小弟整理在了博客,如果有需要可以去看看。
http://blog.csdn.net/qq_42041980/article/details/92718642

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3 自给自足

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版