HAL UART发送接收死锁

2019-07-14 14:51发布

STM32F105S使用中断接收,触发UART_Receive_IT()中的   ......

   if(--huart->RxXferCount == 0)
    {
      __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);

      /* Check if a transmit process is ongoing or not */
      if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
      {
        huart->State = HAL_UART_STATE_BUSY_TX;
      }
      else
      {
        /* Disable the UART Parity Error Interrupt */
        __HAL_UART_DISABLE_IT(huart, UART_IT_PE);

        /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
        __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);

       huart->State = HAL_UART_STATE_READY;
      }
      HAL_UART_RxCpltCallback(huart);


      ......

     进入HAL_UART_RxCpltCallback(huart);后,判断huart->State 尽然不是上面的2个中的一个,然后返回HAL_BUSY状态,导致死锁


    请问哪位遇到过这种情况吗?请指点下,系统使用了FREERTOS.


    现象:
    串口发送(没用中断发送),---->有接收,又触发发送,导致死锁
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
7762642422d
1楼-- · 2019-07-15 13:37
rstech_rd 发表于 2019-1-2 18:05
本帖最后由 benlarden 于 2017-4-10 14:02 编辑

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

你的程序逻辑有严重的潜在问题!
HAL_UART_RxCpltCallback()函数是在中断里被调用的,而你又在该函数里面调用了发送函数:
HAL_UART_Transmit()。
你看代码,HAL_UART_Transmit()会判断uart的状态,此时返回了HAL_BUSY。
另外即使不是由上述原因产生的,也没有这么用的。收发尽量一直(要么中断,要么阻塞式)。
再者,HAL_UART_RxCpltCallback()里面只能用HAL_UART_Receive_IT()类型的开启中断函数。
rstech_rd
2楼-- · 2019-07-15 15:12
BEONEWENHUI 发表于 1970-1-1 08:00

这个发送是调试串口,只是为了测试使用。
朱小露1
3楼-- · 2019-07-15 17:55
7762642422d 发表于 2019-1-2 18:35
你的程序逻辑有严重的潜在问题!
HAL_UART_RxCpltCallback()函数是在中断里被调用的,而你又在该函数里面调用了发送函数:
HAL_UART_Transmit()。

HAL_UART_RxCpltCallback里面也不能用HAL_UART_Receive_IT, 会把ErrorCode覆盖掉, HAL_UART_Receive_IT只是开启中断函数, 可以在对应的IRQHandler最后执行.
lee_st
4楼-- · 2019-07-15 23:09
 精彩回答 2  元偷偷看……
lee_st
5楼-- · 2019-07-16 00:07
赶快放弃库哦
lee_st
6楼-- · 2019-07-16 03:30
配置寄存器多方便

一周热门 更多>