[STM32F1] stm32 uart串口缓存接收,FIFO缓存

[复制链接]
483|0
 楼主| 1988020566 发表于 2023-5-29 10:45 | 显示全部楼层 |阅读模式


  1. /////////////////////////////////////////////////////头文件部分///////////////////////////////////////////////////////////////////////////////
  2. #define EMPTY     0xFFFF
  3. #define TIMEOUT 0xFFFF


  4. #define UART2_RBUF_SIZE   256        //要求:2 的整次幂
  5. #if UART2_RBUF_SIZE < 2
  6. #error UART2_RBUF_SIZE is too small.  It must be larger than 1.
  7. #elif ((UART2_RBUF_SIZE & (UART2_RBUF_SIZE-1)) != 0)
  8. #error UART2_RBUF_SIZE must be a power of 2.
  9. #endif



  10. typedef struct uart2_rbuf_st
  11. {
  12.     unsigned int in;                            //输入
  13.     unsigned int out;                            //输出
  14.     unsigned char  buf [UART2_RBUF_SIZE];        //缓冲区空间
  15. }UART2_RBUF_ST;

  16. extern UART2_RBUF_ST    uart2_rbuf;
  17. uint16_t USART2_GetCharBlock(uint16_t timeout);
  18. uint16_t USART2_GetChar(void);

  19. //////////////////////////////////////////////////////c代码部分////////////////////////////////////////////////////////////////////////////////

  20. /**********************************************************************************
  21. * 串口1接收字符函数,阻塞模式(接收缓冲区中提取)
  22. **********************************************************************************/
  23. uint16_t USART2_GetCharBlock(uint16_t timeout)
  24. {
  25.     UART2_RBUF_ST *p = &uart2_rbuf;
  26.     uint16_t to = timeout;   
  27.     while((p->in - p->out) == 0)if(!(--to))return TIMEOUT;
  28.     return (p->buf [(p->out++) & (UART2_RBUF_SIZE - 1)]);
  29. }

  30. /**********************************************************************************
  31. * 串口1接收字符函数,非阻塞模式(接收缓冲区中提取)
  32. **********************************************************************************/
  33. uint16_t USART2_GetChar(void)
  34. {
  35.     UART2_RBUF_ST *p = &uart2_rbuf;   
  36.     if((p->in - p->out) == 0) //缓冲区空条件
  37.         return EMPTY;
  38.     return USART2_GetCharBlock(1000);
  39. }
  40. //printf定义
  41. PUTCHAR_PROTOTYPE
  42. {
  43.   
  44.   HAL_UART_Transmit(&Usart2Handle, (uint8_t *)&ch, 1, 0xFFFF);
  45.   return ch;
  46. }



  47. ///////////////////////////////////////////////////中断处理部分/////////////////////////////////////////////////////////////////////////////////

  48. void USART2_IRQHandler(void)
  49. {
  50.     uint8_t d;
  51.     UART2_RBUF_ST *p = &uart2_rbuf;
  52.    
  53.     /* UART in mode Receiver ---------------------------------------------------*/
  54.     //if((__HAL_UART_GET_IT(&Usart2Handle, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&Usart2Handle, UART_IT_RXNE) != RESET))
  55.     if((__HAL_UART_GET_IT(&Usart2Handle, UART_IT_RXNE) != RESET))
  56.     {
  57.         d = (uint8_t)(Usart2Handle.Instance->RDR);
  58.         if((p->in - p->out)<UART2_RBUF_SIZE)
  59.         {
  60.             p->buf [p->in & (UART2_RBUF_SIZE-1)] = d;   
  61.             p->in++;
  62.         }
  63.         while(HAL_IS_BIT_SET(Usart2Handle.Instance->ISR, UART_FLAG_RXNE));//清楚中断标志
  64.     }
  65.     HAL_UART_IRQHandler(&Usart2Handle);
  66. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

423

主题

11031

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部