使用串口空闲中断可以用来接收不定长数据,比使用接收完成中断降低中断次数。发送可以用dma模式,也可以不用。发送完成调用发送完成中断。注意:空闲中断是一个字节时间内空闲触发,如果两帧数据之间空闲太短会不触发空闲中断。新版本hal库使用HAL_UARTEx_ReceiveToIdle_DMA或者HAL_UARTEx_ReceiveToIdle_IT,跟旧版本不太一样。
0. 串口初始化使能中断。
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
1.串口发送
void uart_start_send(uint8_t* tx_buf,uint16_t tx_len)
{
Uart1TxEnable();
HAL_UART_Transmit_IT(&huart1, tx_buf, tx_len);
}
2.串口接收
void uart_start_receive(void)
{
Uart1RxEnable();
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rx_buf, DATA_BUF_SIZE);
}
3.发送完成中断回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
uart_start_receive();
}
4.接收空闲中断回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if (huart == &huart1)
{
//...
}
}
5.stm32f4xx_it.c
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rx_buf, DATA_BUF_SIZE);
/* USER CODE END USART1_IRQn 1 */
}