今天花了1天时间调试不定长数据接收功能期间参考了很多例程,但总是问题不断。费了九牛二虎之力最后总算是调通了。整个过程下来发现坑还是非常多的,在此分享下我的经验之谈:
1.打开IDLE中断后此中断并不会调用中断回调函数,因此中断处理函数绝对不能放在回调函数当中,必须直接放到stm32f4xx_it.c文件的void UART8_IRQHandler(void)函数中:
void UART8_IRQHandler(void)
{
/* USER CODE BEGIN UART8_IRQn 0 */
/* USER CODE END UART8_IRQn 0 */
HAL_UART_IRQHandler(&huart8);
/* USER CODE BEGIN UART8_IRQn 1 */
if(__HAL_UART_GET_FLAG(&huart8,UART_FLAG_IDLE) != RESET)
{
if (rxd_uart8[0] == 0xCC && rxd_uart8[1]<18 && u8rxd_end == 0x33)
{
if (u8rxd_end == 0x33 && CalcBlockCrc(rxd_uart8+1,rxd_uart8[1]-1) == u8rxd_crc8)
{
U8Analyze_Package();
}
}
__HAL_UART_CLEAR_IDLEFLAG(&huart8);
HAL_UART_AbortReceive(&huart8);
HAL_UART_Receive_DMA(&huart8,rxd_uart8,19);
}
/* USER CODE END UART8_IRQn 1 */
} |