硬件:
stm32f103c8t6
一块采用串口通信的GPS模块
开发平台:
keil5.20
STM32CubeMx
需要实现的功能:
usart1用于打印usart2中接收到的数据
usart2采用中断模式接收来自GPS模块的数据
遇到的问题:
在while循环中执行中断接收函数,并在回调函数中打印接收到的数据,回调函数调用正常,,
- volatile uint8_t usartTemp[200] ;
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_USART1_UART_Init();
- MX_USART2_UART_Init();
- HAL_UART_Receive_IT(&huart2,usartTemp,200);
- while (1)
- {
-
- HAL_UART_Receive_IT(&huart2,usartTemp,200);
-
- }
-
- }
- // 数据接收完成后调用回调函数,这里只有usart2接收数据,所以不进行串口对象判断
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- static uint8_t count = 0;
- printf("=============%d============\n",count);
- printf("%s\n",usartTemp);
- count++;
- }
既然是中断方式接收数据,总不能一直在while中调用吧,,所以,将第一次调用接收函数置于while函数前,然后在回调函数中再次调用接收函数,开启下一轮数据接收,却发现,程序在进行了一次数据接收后就不再接收数据了,打断点确定回调函数中的接收数据函数确实被调用了,然而就是不再进回调函数了,,,,参照网上资料,添加了__HAL_UART_ENABLE_IT后仍然没用,,使用过基于hal的usart中断接收数据的朋友给指点下吧
- volatile uint8_t usartTemp[200] ;
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_USART1_UART_Init();
- MX_USART2_UART_Init();
- HAL_UART_Receive_IT(&huart2,usartTemp,200);
- // __HAL_UART_ENABLE_IT(&huart2,UART_IT_ERR);
- / __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
- while (1)
- {
- // HAL_UART_Receive_IT(&huart2,usartTemp,200);
-
- }
-
- }
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- static uint8_t count = 0;
- printf("=============%d============\n",count);
- printf("%s\n",usartTemp);
- count++;
- while(HAL_UART_GetState(&huart2) == HAL_UART_STATE_BUSY_RX) {}
- HAL_UART_Receive_IT(&huart2,usartTemp,200);
- // __HAL_UART_ENABLE_IT(&huart2,UART_IT_ERR);
- // __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
- }
是的 问题就在于已经调用了接收中断函数了 为什么没起到作用,,
HAL_UART_Receive_IT 这个函数里面有使能接收中断的语句
如下:
/* Enable the UART Parity Error Interrupt */
__HAL_UART_ENABLE_IT(huart, UART_IT_PE);
/* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
__HAL_UART_ENABLE_IT(huart, UART_IT_ERR);
/* Enable the UART Data Register not empty Interrupt */
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);,
所以你加那些使能中断的语句没有必要,这个只是接收状态已就绪,将指针位子和大小留好,需要你发送数据给接收引脚然后通过HAL_UART_IRQHandler 一次性传入指定的个数到你给的缓冲区里,我最近在用这个,也是摸索着走。。。。
发现是这个USE_HAL_UART_REGISTER_CALLBACKS没有打开,导致预编译的时候相关的函数被屏蔽