STM32对HAL库的串口不定长度的读写操作(三)

关于利用中断实现串口不定长接收,还可以使用串口通讯协议来控制读写的长度。

先设定停止结束标志位为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也可以直接清空缓存数组。

原文地址:https://www.cnblogs.com/zjx123/p/12928451.html