之前在网上看到有DMA传输接收不定长数据,使用到IDLE中断。这次使用串口中断接收不定长数据,通过IDLE中断的标志位
新手上路,想试试写个博客,记录一下自己学的东西。
在大佬的帖子上学习到的使用DMA及IDLE中断接收大量不定长数据的方法。但现在我要接收的只是很短的不定长数据,就想不使用DMA,用串口中断接收及IDLE的方式接收数据。
大佬的链接:
链接: link.
下面是我自己写的使用串口中断和IDLE中断接收不定长数据的方法。
使用cubeMX创建工程,打开串口中断。
串口3中断接收初始化,IDLE中断初始化
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
HAL_UART_Receive_IT(&huart3, (uint8_t *)&RxByte, 1);
定义变量
uint8_t RxByte;//串口接收到的一个字节数据
uint8_t count=0;//串口接收数据个数
uint8_t UART3_RxBuffer[50];//将串口接收到的数据存入数组中
uint8_t recv_end_flag=0;//串口接收完成标志位
添加回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART3)//如果是串口3
{
UART3_RxBuffer[count++] = RxByte; //接收数据转存
HAL_UART_Receive_IT(&huart3, (uint8_t *)&RxByte, 1); //再开启接收中断
}
}
在stm32l1xx_it.c中的串口3中断函数USART3_IRQHandler中添加读取IDLE标志位的代码
void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
uint32_t tmp_flag=0;
tmp_flag =__HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE);//读取IDLE中断标志位
if((tmp_flag != RESET))//idle标志被置位
{
__HAL_UART_CLEAR_IDLEFLAG(&huart3);//清除IDLE标志位
recv_end_flag = 1;//接收完成标志位
}
/* USER CODE END USART3_IRQn 0 */
HAL_UART_IRQHandler(&huart3);
/* USER CODE BEGIN USART3_IRQn 1 */
/* USER CODE END USART3_IRQn 1 */
}
主函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART3_UART_Init();
/* USER CODE BEGIN 2 */
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
HAL_UART_Receive_IT(&huart3, (uint8_t *)&RxByte, 1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(recv_end_flag==1)//如果接收完成
{
recv_end_flag=0;//接收标志位复位
HAL_UART_Transmit(&huart3, UART3_RxBuffer, count, 1000);//将接收到的数据通过串口发送回去
count=0;//清空接收计数
memset(UART3_RxBuffer,0x00,sizeof(UART3_RxBuffer));//清除接收数组
}
}
/* USER CODE END 3 */
}
结果
随机发送的数据完整发送回来。
源代码链接: https://pan.baidu.com/s/1aBkpL_JwlDoKMgWpwvccZA
提取码:vapt