初级会员

- 积分
- 116
- 金钱
- 116
- 注册时间
- 2019-7-13
- 在线时间
- 33 小时
|
发表于 2019-9-23 09:38:38
|
显示全部楼层
本帖最后由 lidabenshili 于 2019-9-23 09:55 编辑
你好,你的问题我也遇到过。原因在于你通过串口发送数据时使用的延时发送函数HAL_UART_Transmit(&huart1,ubuf1,ulen1, 0xff); 如果使用中断发送函数HAL_UART_Transmit_IT()就不会出现这个问题,收发就会正常。追究其根本原因,我的追踪过程如下:
1、一段时间后进入不了接收回调函数,猜测是接收中断未打开,每次进入函数HAL_UART_Receive_IT(&huart1,&re1,1)中都会重新打开一次接收中断,经过调试发现,一段时间后接收不到数据是因为HAL_UART_Receive_IT(&huart1,&re1,1)函数返回值是HAL_BUSY(即接收中断打开失败!)
2、经过进一步追踪发现,HAL_BUSY是在函数HAL_UART_Receive_IT(&huart1,&re1,1)中的__HAL_LOCK(huart)语句内返回的,说明此时huart1已经被锁定了。
3、huart1变量是在哪锁定的呢?此时在进入HAL_UART_Transmit(&huart1,ubuf1,ulen1, 0xff)函数内部,会发现在发送的这段时间时间内变量huart1一直被锁定住了。所以在发送的这段时间内如果接收到了数据,在接收中断回调函数中再次调用HAL_UART_Receive_IT(&huart1,&re1,1)的时候就不会调用成功,接收中断就不会再次被打开。所以之后就再也接收不到数据了。
4、我目前的解决办法是发送也采用中断发送,或者用DMA方式发送。此问题就不会出现。再有一个解决办法就是,用HAL_UART_Transmit(&huart1,ubuf1,ulen1, 0xff)发送之前关闭接收中断,该函数之后再打开中断。应根据实际情况选择解决办法。
希望对你有帮助。对库函数的深入了解还是很有必要的,在调试CAN的时候我也遇到类似的问题了。(Q:744180121) |
|