zoukankan      html  css  js  c++  java
  • UART HAL使用环形队列收发数据

    #ifndef USER_COMFIFO_H
    #define USER_COMFIFO_H
    
    #include "stm32f4xx_hal.h"
    #define RINGBUFF_LEN 512
    typedef struct
    {
    	uint16_t Head;
      uint16_t Tail;
      uint16_t Lenght;
      uint8_t Ring_Buff[RINGBUFF_LEN];
    }RingBuff_t;
    RingBuff_t ringBuff;//创建一个ringBuff的缓冲区
    void RingBuff_Init(void);
    uint8_t  Write_RingBuff(uint8_t data);
    uint8_t Read_RingBuff(uint8_t *rData);
    #endif
    
    #include"ComFIFO.h"
    /**
    * @brief RingBuff_Init
    * @param void
    * @return void
    * @author 杰杰
    * @date  2018
    * @version v1.0
    * @note  初始化环形缓冲区
    */
    void RingBuff_Init(void)
    {
      //初始化相关信息
      ringBuff.Head = 0;
      ringBuff.Tail = 0;
      ringBuff.Lenght = 0;
    }
    /**
    * @brief Write_RingBuff
    * @param u8 data
    * @return FLASE:环形缓冲区已满,写入失败;TRUE:写入成功
    * @author 杰杰
    * @date  2018
    * @version v1.0
    * @note  往环形缓冲区写入u8类型的数据
    */
    uint8_t Write_RingBuff(uint8_t data)
    {
      if(ringBuff.Lenght >= RINGBUFF_LEN) //判断缓冲区是否已满
      {
       return 0;
      }
      ringBuff.Ring_Buff[ringBuff.Tail]=data;
    //  ringBuff.Tail++;
      ringBuff.Tail = (ringBuff.Tail+1)%RINGBUFF_LEN;//防止越界非法访问
      ringBuff.Lenght++;
      return 1;
    }
    /**
    * @brief Read_RingBuff
    * @param u8 *rData,用于保存读取的数据
    * @return FLASE:环形缓冲区没有数据,读取失败;TRUE:读取成功
    * @author 杰杰
    * @date  2018
    * @version v1.0
    * @note  从环形缓冲区读取一个u8类型的数据
    */
    uint8_t Read_RingBuff(uint8_t *rData)
    {
      if(ringBuff.Lenght == 0)//判断非空
      {
        return 0;
      }
      *rData = ringBuff.Ring_Buff[ringBuff.Head];//先进先出FIFO,从缓冲区头出
    //  ringBuff.Head++;
      ringBuff.Head = (ringBuff.Head+1)%RINGBUFF_LEN;//防止越界非法访问
      ringBuff.Lenght--;
      return 1;
    }
    

    2、调用方法

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    	if(huart->Instance==USART3)
    	{
    
    		Write_RingBuff(RxBuffer[0]);
    		//USARTx_ReceiveFIFO_PutChar(&Com1FIFO,RxBuffer[0]);
    		HAL_UART_Receive_IT(&huart3, (uint8_t *)RxBuffer, 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();
      //USARTx_ReceiveFIFO_Init(&Com1FIFO);
      RingBuff_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 */
      /* USER CODE END 2 */
      HAL_UART_Receive_IT(&huart3, (uint8_t *)RxBuffer, 1);
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
       {
    	  uint8_t data[1024];
    	  uint16_t dataLength=0;
    	  uint16_t read=Read_RingBuff(&data[dataLength]);
    	  if(read>0)dataLength++;
    	  while(read>0)
    	  {
    
    		  read=Read_RingBuff(&data[dataLength]);
    		  if(read>0)dataLength++;
    	  }
    	  HAL_UART_Receive_IT(&huart3, (uint8_t *)RxBuffer, 1);
    	  if(dataLength>0)
    	  {
    		  HAL_UART_Transmit(&huart3, (uint8_t *)data, dataLength,0xFFFF);
    	  }
       }
    }
    

      

    参考:https://blog.csdn.net/jiejiemcu/article/details/80563422  

      

      

      

    1、建了一个小群:616945527(软件), 欢迎大家加入,加群口令abc123,硬件嵌入式开发者推荐75764412(单片机)。
    闲置域名www.nsxz.com出售(等宽等高字符四字域名,可组合多种有意义词语)。
  • 相关阅读:
    Mysql数据优化--DBA梳理珍藏篇
    Spring缓存注解@Cacheable
    Spring常用知识点
    谈一谈对MySQL InnoDB的认识及数据库事物处理的隔离级别
    MySQL主从复制的实现过程
    List 与 数组 互转
    位运算实现小正整数乘法
    最大的K个数
    Java 编码与字符(2)
    JSP工作原理
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/14884501.html
Copyright © 2011-2022 走看看