关于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 15:01 编辑
因为中断接收要接受完10个数据才会调用回调函数,并且调用之前会关掉中断,所以下次再发来就没用了,所以你需要在回调函数里再次调用HAL_UART_Receive_IT。
坐这个实验还是推荐用标准库的方法
风子 发表于 2015-10-30 14:57
因为中断接收要接受完10个数据才会调用回调函数,并且调用之前会关掉中断,所以下次再发来就没用了,所以你 ...
我可不可以这么理解,如果我只从串口助手发送一个数据,那它岂不是不会进入回调函数我已经试过了 好像是这样的 是的,如果你要一个数据就进回调,应该写 HAL_UART_Receive_IT(&huart2, &data, 1); 风子 发表于 2015-10-30 16:04
是的,如果你要一个数据就进回调,应该写 HAL_UART_Receive_IT(&huart2, &data, 1);
这个我刚试了是可以的,但是我这么写HAL_UART_Receive_IT(&huart2, &data3,5); 接收五次才回调,我用串口助手发送了五次为什么没有进入回调
页:
[1]