540429224 发表于 2019-6-16 19:34:44

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

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

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

2.我如果修改了判断条件,改成ready,处理到if(huart->Init.Parity == UART_PARITY_NONE)部分下就直接跳出到主循环,为什么会产生这个情况?明明只是单纯的赋值而已?

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);
用来开启串口(不然只能进去一次接收中断函数)。

发表于 2019-6-17 08:39:45

出现这个问题的时候,大多数是因为加断点,接收数据发生了溢出导致。建议楼主不要在中断中加断点,HAL库发生这个异常以后,建议重新初始化一下串口。

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串口才能够正常通信

540429224 发表于 2019-6-17 16:15:47

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

大神,我重新配置了时钟也不行,设定了一个LED翻转语句,在接收中断函数可以被触发,但是在main里面定义的接收回调函数却不可以。我只添加了三个地方的代码,一个在接收中断函数,一个在主函数,一个在串口初始化文件,能不能帮忙看看是遗漏了还是配置错了?谢谢。

Cortexxx 发表于 2019-6-17 16:36:16

调大一下堆栈试一下吧 :DD

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的变量,压根就进不了回调函数。
页: [1] 2
查看完整版本: HAL库串口中断接收不了数据