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

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

[复制链接]
540429224 提问时间: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个回答
540429224 回答时间: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

查看全部评分

540429224 回答时间: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

查看全部评分

540429224 回答时间: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);
540429224 回答时间:2019-6-17 17:00:11
Cortexxx 发表于 2019-6-17 16:36
调大一下堆栈试一下吧 D

怎么调?能指点一下么?
540429224 回答时间: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的变量,压根就进不了回调函数。
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版