打印
[STM32F1]

stm32 uart串口缓存接收,FIFO缓存

[复制链接]
272|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1988020566|  楼主 | 2023-5-29 10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


/////////////////////////////////////////////////////头文件部分///////////////////////////////////////////////////////////////////////////////
#define EMPTY     0xFFFF
#define TIMEOUT 0xFFFF


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



typedef struct uart2_rbuf_st
{
    unsigned int in;                            //输入
    unsigned int out;                            //输出
    unsigned char  buf [UART2_RBUF_SIZE];        //缓冲区空间
}UART2_RBUF_ST;

extern UART2_RBUF_ST    uart2_rbuf;
uint16_t USART2_GetCharBlock(uint16_t timeout);
uint16_t USART2_GetChar(void);

//////////////////////////////////////////////////////c代码部分////////////////////////////////////////////////////////////////////////////////

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

/**********************************************************************************
* 串口1接收字符函数,非阻塞模式(接收缓冲区中提取)
**********************************************************************************/
uint16_t USART2_GetChar(void)
{
    UART2_RBUF_ST *p = &uart2_rbuf;   
    if((p->in - p->out) == 0) //缓冲区空条件
        return EMPTY;
    return USART2_GetCharBlock(1000);
}
//printf定义
PUTCHAR_PROTOTYPE
{
  
  HAL_UART_Transmit(&Usart2Handle, (uint8_t *)&ch, 1, 0xFFFF);
  return ch;
}



///////////////////////////////////////////////////中断处理部分/////////////////////////////////////////////////////////////////////////////////

void USART2_IRQHandler(void)
{
    uint8_t d;
    UART2_RBUF_ST *p = &uart2_rbuf;
   
    /* UART in mode Receiver ---------------------------------------------------*/
    //if((__HAL_UART_GET_IT(&Usart2Handle, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&Usart2Handle, UART_IT_RXNE) != RESET))
    if((__HAL_UART_GET_IT(&Usart2Handle, UART_IT_RXNE) != RESET))
    {
        d = (uint8_t)(Usart2Handle.Instance->RDR);
        if((p->in - p->out)<UART2_RBUF_SIZE)
        {
            p->buf [p->in & (UART2_RBUF_SIZE-1)] = d;   
            p->in++;
        }
        while(HAL_IS_BIT_SET(Usart2Handle.Instance->ISR, UART_FLAG_RXNE));//清楚中断标志
    }
    HAL_UART_IRQHandler(&Usart2Handle);
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

402

主题

10700

帖子

6

粉丝