之前在前面的一篇文章里写了一种串口收发不定长帧的方法(http://t.csdnimg.cn/fifcw),现在有一种更简单的,不需要设置帧尾,在一定的长度限制下可以自由收发。
1. 原理
这种收发就是利用串口本身就有的IDLE(空闲)事件中断:
在发送一组数据帧后会有一段空闲,这时就触发了空闲中断,我们可以在这个中断里处理数据读出数据。
2. 代码
我将整体的流程以及函数调用制成如下流程图:
在While函数前一定要加:
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,USART1_RX,50);
中断函数及服务函数:
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,USART1_RX,50);
/* USER CODE END USART1_IRQn 1 */
}
/* USER CODE BEGIN 1 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance== USART1)
{
HAL_UART_Transmit(&huart1,(uint8_t *)USART1_RX,Size,10);
memset(USART1_RX,0,Size);
}
}
效果: