关于利用中断实现串口不定长接收,还可以使用串口通讯协议来控制读写的长度。
先设定停止结束标志位为0x02(自定义)。
新建一些数组备用:
uint8_t value; //进入中断接收数据的变量 或 uint8_t value[1]; uint8_t getBuffer[50]; //保存接收到的数据的数组 uint8_t countOfGetBuffer = 0; //接受到的数据长度
在main函数的while循环前利用下面函数开启串口接收中断:
HAL_UART_Receive_IT(&huart1, (uint8_t *)(&value), 1); //打开串口中断接收
//或者value[1]对应的HAL_UART_Receive_IT(&huart1, (uint8_t *)value, 1);
接下来可以选在重写串口接收回调函数,也可以在it.c中的中断执行函数中写。
这里用stm32f1xx_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 */ getBuffer [countOfGetBuffer] = value; if(getBuffer[countOfGetBuffer] == 0x2A) //停止位 { Flag = 1; } countOfGetBuffer++; if(Flag == 1) //停止位 { if(getBuffer[0] == 0x00)//左移 { Left(); } else if(getBuffer[0] == 0x01)//右移复位 { Reset_Motor(); } else if(getBuffer[0] == 0x02) { if((S2_Read != 0) && (S3_Read != 0)) HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_7); } for(uint8_t i = 0;i < 50;i++) //清空缓存数组 { getBuffer[i] = 0; } Flag = 0; countOfGetBuffer = 0; } HAL_UART_Receive_IT(&huart1, (uint8_t *)&value,1); //每接收一个数据就打开一次接收 /* USER CODE END USART1_IRQn 1 */ }
对于清空数组,有函数memset也可以直接清空缓存数组。