C_YANG_HEN 发表于 2018-3-11 14:13:44

STM32 hal 库无法接收串口数据

型号:STM32L432KC官方开发板
串口使用的是板载的USB下载口以及串口

用法:
在串口初始化后,while(1)之前调用 接收中断函数 HAL_UART_Receive_IT(),接收一个字节产生中断。在接收中断回调函数中处理保存数据并重新开启接收一个字节的中断。
回掉函数的代码:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
//                printf("rx callback!\n");

                buf = data;
               
    uint8_t ret = HAL_OK;
    /* Set transmission flag: trasfer complete*/
    do
    {
      ret = HAL_UART_Receive_IT(UartHandle, (uint8_t *)&data, 1);
    }while(ret != HAL_OK);
}



现象:
上电后会产生一次串口中断,进入这个函数。但此时并没有发送数据。

另外,后续发送任何数据都没有反应。无法产生中断。





toofree 发表于 2018-3-11 16:58:35

先跑个样例程序,不要想当然。


安装个STM32Cube_FW_L4库,然后跑跑样例程序“STM32Cube_FW_L4_V1.11.0\Projects\NUCLEO-L432KC\Examples\UART\UART_TwoBoards_ComIT”





wenyangzeng 发表于 2018-3-11 17:42:05

__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
就OK了。

C_YANG_HEN 发表于 2018-3-12 09:12:06

toofree 发表于 2018-3-11 16:58
先跑个样例程序,不要想当然。




主要是这些都是两块板之间通信的。另外都是在主函数之前就通信完成,while(1)里面不进行操作的那种。

C_YANG_HEN 发表于 2018-3-12 09:13:31

wenyangzeng 发表于 2018-3-11 17:42
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
就OK了。
就是说在回掉函数中只用再次开启这个,不用重新使用HAL_UART_Receive_IT()?

wudianjun2001 发表于 2018-3-12 09:43:11

最好不好在中断里死循环,还是先搞个例程跑一下,然后在例程的基础上修改

wenyangzeng 发表于 2018-3-12 09:46:06

C_YANG_HEN 发表于 2018-3-12 09:13
就是说在回掉函数中只用再次开启这个,不用重新使用HAL_UART_Receive_IT()?

主函数中调用一次就够了

C_YANG_HEN 发表于 2018-3-12 18:05:07

wenyangzeng 发表于 2018-3-12 09:46
主函数中调用一次就够了

这样子不能再次接收下一次的数据

C_YANG_HEN 发表于 2018-3-12 18:06:05

wudianjun2001 发表于 2018-3-12 09:43
最好不好在中断里死循环,还是先搞个例程跑一下,然后在例程的基础上修改 ...

我用这样的方式在STM32F469Discovery官方板上是可以的。连续的接收数据。

wenyangzeng 发表于 2018-3-12 19:25:43

C_YANG_HEN 发表于 2018-3-12 18:05
这样子不能再次接收下一次的数据

初始化串口后调用,并不是在回调函数里调用的。
页: [1] 2
查看完整版本: STM32 hal 库无法接收串口数据