yaowei 发表于 2015-10-30 14:02:01

关于STM32F411RET的串口中断

之前对于串口中断的理解是只要使能了串口中断,比如接收中断,那么只要已接收到数据,就会进入中断服务函数,但是这次用了HAL库的中断。
它的使能函数是HAL_UART_Receive_IT(&huart2, &data, 10);如果一有数据过来,那么就会进入相应的回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

本来高高兴兴的打算做一个从串口助手发数据,单片机只要一接收到,就把这个刚接收到的数据发给电脑串口助手。
但是问题来了,程序跑起来之后,从串口助手发第一次,单片机接收到了,然后往串口助手那边发出数据,可是第二次就不行,就相当于这个中断只用了一次就用不了


望大神帮忙看看代码如下几句:

HAL_UART_Receive_IT(&huart2, &data, 10); //使能接收中断
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
                                                               
}
/* USER CODE END 3 */

}


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//接收中断的回调函数
{
      HAL_UART_Transmit(&huart2, &data2, 1,10);
}

风子 发表于 2015-10-30 14:57:52

本帖最后由 风子 于 2015-10-30 15:01 编辑

因为中断接收要接受完10个数据才会调用回调函数,并且调用之前会关掉中断,所以下次再发来就没用了,所以你需要在回调函数里再次调用HAL_UART_Receive_IT。
坐这个实验还是推荐用标准库的方法




yaowei 发表于 2015-10-30 15:54:55

风子 发表于 2015-10-30 14:57
因为中断接收要接受完10个数据才会调用回调函数,并且调用之前会关掉中断,所以下次再发来就没用了,所以你 ...

我可不可以这么理解,如果我只从串口助手发送一个数据,那它岂不是不会进入回调函数我已经试过了 好像是这样的

风子 发表于 2015-10-30 16:04:22

是的,如果你要一个数据就进回调,应该写 HAL_UART_Receive_IT(&huart2, &data, 1);

yaowei 发表于 2015-10-30 17:18:54

风子 发表于 2015-10-30 16:04
是的,如果你要一个数据就进回调,应该写 HAL_UART_Receive_IT(&huart2, &data, 1);

这个我刚试了是可以的,但是我这么写HAL_UART_Receive_IT(&huart2, &data3,5); 接收五次才回调,我用串口助手发送了五次为什么没有进入回调
页: [1]
查看完整版本: 关于STM32F411RET的串口中断