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


/////////////////////////////////////////////////////頭文件部分///////////////////////////////////////////////////////////////////////////////
#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);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM