1-使用轮询10ms超时,buf_len定长17,发现偶尔会错包导致丢失一个数据,所以想测试一下中断通信方式
2-使用中断的时候发现在HAL_UART_RxCpltCallback此函数内使用HAL_UART_Receive_IT重新开启中断,发现还是只能触发一次
解决办法:在stm32f4xx_it.c里找到USART3_IRQHandler函数,并
HAL_UART_Receive_IT添加在里面,如下:
void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
/* USER CODE END USART3_IRQn 0 */
HAL_UART_IRQHandler(&huart3);
/* USER CODE BEGIN USART3_IRQn 1 */
HAL_UART_Receive_IT(&huart3, &data_buf, 17);
/* USER CODE END USART3_IRQn 1 */
}
重写void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
/* 判断是哪个串口触发的中断 */
if(huart ->Instance == USART3) {
for (int i = 0; i < sizeof(data_buf); i++) {
}
// 解包代码
memset(data_buf, 0x00, sizeof(data_buf));
// HAL_UART_Receive_IT(&huart3, &data_buf, 17);
}
}
}
}
main.c启用中断
MX_USART3_UART_Init();
memset(data_buf, 0x00, sizeof(data_buf));
HAL_UART_Receive_IT(&huart3, data_buf, 17);
经测试无问题,并没在出现错包丢包问题,用的是定长17,如果是不定长的,需要一位一位接收,然后根据自定协议解包打包