⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rd_useserialbuff.c

📁 LCD1602键盘显示模块实例
💻 C
字号:
/***********************************************************
*   函数库说明:串行通讯缓冲区处理函数库                   *
*   版本:      v1.00                                      *
*   作者:      王卓然                                     *
*   创建日期:  2006年4月24日                              *
* -------------------------------------------------------- *
*  [支 持 库]                                              *
*   支持库名称:RD_MacroAndConst.h                         *
*   需要版本:  v0.01 &abv                                 *
*   函数库说明:系统常用宏定义库                           *
*                                                          *
*   支持库名称:RD_UseSerialBuff.h                         *
*   需要版本:  -----                                      *
*   声明库说明:串行通讯缓冲区处理声明库                   *
* -------------------------------------------------------- *
*  [版本更新]                                              *
*   修改:      王卓然                                     *
*   修改日期:  2006年5月20日                              *
*   版本:      v0.31                                      *
*                                                          *
*   修改:      王卓然                                     *
*   修改日期:  2007年3月1日                               *
*   版本:      v0.40                                      *
*                                                          *
*   修改:      王卓然                                     *
*   修改日期:  2007年3月2日                               *
*   版本:      v1.00                                      *
* -------------------------------------------------------- *
*  [版本历史]                                              *
*       v0.30  该版本提供了最基本的环形队列缓冲区操作函数。*
*       v0.31  增加了调用该函数时候的宏说明,可以选择需要  *
*              提供的缓冲区功能。                          *
*       v0.40  增加了串口发送进程。增加了原子操作。        *
*       v1.00  针对新规范进行了修改,增加自动收发进程。    *
* -------------------------------------------------------- *
*  [使用说明]                                              *
*           1、通过SERIAL_RX_BUFF_SIZE来设定接收缓冲区的大 *
*              小;通过SERIAL_TX_BUFF_SIZE来设定发送缓冲区 *
*              的大小。                                    *
*           2、通过定义_USE_SERIAL_RX_BUFF来选择添加一个接 *
*              收缓冲区;通过定义_USE_SERIAL_TX_BUFF来添加 *
*              一个发送缓冲区。                            *
*           3、在取数的时候,有时候要考虑屏蔽中断,否则会  *
*              出现不可预知的后果。                        *
*           4、可以通过宏_USE_SERIAL_TX_TRANSMITTER_PROC在 *
*              使用发送缓冲时,使用自动发送进程。并需要定  *
*              义宏UDR_PORT来指定发送端口、也需要将宏      *
*              SERIAL_INSERT_USART_TX_ISR_CODE插入到发送完 *
*              成中断处理程序中。                          *
*           5、使用宏SERIAL_ENABLE_WRITE定义额外的发送使能 *
*              代码。例如485总线的发送使能等。             *
*           6、使用宏SERIAL_DISABLE_WRITE定义额外的发送使  *
*              能关闭代码。例如485总线发送使能的关闭。     *
***********************************************************/

/********************
* 头 文 件 配 置 区 *
********************/
# include "LIB_Config.h"
# include "RD_MacroAndConst.h"
# include "RD_UseSerialBuff.h"

/********************
*   系 统 宏 定 义  *
********************/

/*------------------*
*   常 数 宏 定 义  *
*------------------*/
#ifndef SERIAL_RX_BUFF_SIZE
    # define SERIAL_RX_BUFF_SIZE 32
#endif
#ifndef SERIAL_TX_BUFF_SIZE
    # define SERIAL_TX_BUFF_SIZE 32
#endif
#ifdef _USE_SERIAL_TX_TRANSMITTER_PROC
    #ifndef UDR_PORT
        # error Need for UDR_PORT!
    #endif

    #ifndef SERIAL_ENABLE_WRITE
        # define SERIAL_ENABLE_WRITE
    #endif

    #ifndef SERIAL_DISABLE_WRITE
        # define SERIAL_DISABLE_WRITE
    #endif
#endif
/********************
*   函 数 声 明 区  *
********************/
#ifdef _USE_SERIAL_RX_BUFF
BOOL UARTaddDataToRxBuff(uint8 Data);
BOOL UARTgetDataFromRxBuff(uint8 *Data);
#endif

#ifdef _USE_SERIAL_TX_BUFF
BOOL UARTaddDataToTxBuff(uint8 Data);
BOOL UARTgetDataFromTxBuff(uint8 *Data);
    #ifdef _USE_SERIAL_TX_TRANSMITTER_PROC
BOOL PROC_Serial_Transmitter(void);
    #endif
#endif

/********************
*   模块变量定义区  *
********************/
#ifdef _USE_SERIAL_RX_BUFF
static uint8  UARTRxBuff[SERIAL_RX_BUFF_SIZE];
static unsigned int  UARTRxBuffHead = 0;
static unsigned int  UARTRxBuffTail = 0;
static unsigned int  UARTRxBuffCounter = 0;
#endif

#ifdef _USE_SERIAL_TX_BUFF
static uint8  UARTTxBuff[SERIAL_TX_BUFF_SIZE];
static unsigned int  UARTTxBuffHead = 0;
static unsigned int  UARTTxBuffTail = 0;
static unsigned int  UARTTxBuffCounter = 0;
#endif
 
/********************
*   全局变量定义区  *
********************/
#ifdef _USE_SERIAL_TX_BUFF
    #ifdef _USE_SERIAL_TX_TRANSMITTER_PROC
BOOL g_bIfSerialTransmitCompleted = TRUE;
    #endif
#endif

/***********************************************************
*   函数说明:接收缓冲区取值函数                           *
*   输入:    存储取出数据地址的指针                       *
*   输出:    取值是否成功                                 *
*   调用函数:无                                           *
***********************************************************/
#ifdef _USE_SERIAL_RX_BUFF
BOOL UARTgetDataFromRxBuff(uint8  *Data)
{
    SAFE_CODE_PERFORMANCE
    (
        if ((UARTRxBuffHead == UARTRxBuffTail) 
         && (UARTRxBuffCounter == 0))
        {
            SEI();
            return FALSE;
        }
        (*Data) = UARTRxBuff[UARTRxBuffHead++];
    
        UARTRxBuffCounter--;
    
        if (UARTRxBuffHead == SERIAL_RX_BUFF_SIZE)
        {
            UARTRxBuffHead = 0;
        }
    )		
    return TRUE;
}

/***********************************************************
*   函数说明:接收缓冲区首数据察看函数                     *
*   输入:    存储取出数据地址的指针                       *
*   输出:    取值是否成功                                 *
*   调用函数:无                                           *
***********************************************************/
BOOL UARTPeekDataFromRxBuff(uint8 *pData)
{
    SAFE_CODE_PERFORMANCE
    (
        if ((UARTRxBuffHead == UARTRxBuffTail) 
         && (UARTRxBuffCounter == 0))
        {
            SEI();
            return FALSE;
        }
        (*pData) = UARTRxBuff[UARTRxBuffHead];
    )		
    return TRUE;
}

/***********************************************************
*  函数说明:向通讯输入缓冲区添加数据函数                  *
*  输入:    收到的数据                                    *
*  输出:    无                                            *
*  调用函数:无                                            *
***********************************************************/
BOOL UARTaddDataToRxBuff(uint8  Data)
{
    SAFE_CODE_PERFORMANCE
    (
        if ((UARTRxBuffHead == UARTRxBuffTail) 
         && (UARTRxBuffCounter == SERIAL_RX_BUFF_SIZE))
        {
            SEI();
            return FALSE;
        }
        UARTRxBuff[UARTRxBuffTail++] = Data;
    
        UARTRxBuffCounter++;
    
        if (UARTRxBuffTail == SERIAL_RX_BUFF_SIZE)
        {
            UARTRxBuffTail = 0;
        }
	)	
    return TRUE;
}
#endif

#ifdef _USE_SERIAL_TX_BUFF
/***********************************************************
*  函数说明:发送中断取值函数                              *
*  输入:    存储取出数据地址的指针                        *
*  输出:    取值是否成功                                  *
*  调用函数:无                                            *
***********************************************************/
BOOL UARTgetDataFromTxBuff(uint8 *Data)
{

    SAFE_CODE_PERFORMANCE
    (
        if ((UARTTxBuffHead == UARTTxBuffTail) 
         && (UARTTxBuffCounter == 0))
        {
            SEI();
            return FALSE;
        }
        (*Data) = UARTTxBuff[UARTTxBuffHead++];
    
        UARTTxBuffCounter--;
    
        if (UARTTxBuffHead == SERIAL_TX_BUFF_SIZE)
        {
            UARTTxBuffHead = 0;
        }
    )		
    return TRUE;
}

/***********************************************************
*   函数说明:首数据察看函数                               *
*   输入:    存储数据地址的指针                           *
*   输出:    取值是否成功                                 *
*   调用函数:五                                           *
***********************************************************/
BOOL UARTPeekDataFromTxBuff(uint8 *pData)
{
    SAFE_CODE_PERFORMANCE
    (
        if ((UARTTxBuffHead == UARTTxBuffTail) 
         && (UARTTxBuffCounter == 0))
        {
            SEI();
            return FALSE;
        }
        (*pData) = UARTTxBuff[UARTTxBuffHead];
    )		
    return TRUE;
}

/***********************************************************
*  函数说明:向通讯输出缓冲区添加数据函数                  *
*  输入:    需要发送的数据                                *
*  输出:    无                                            *
*  调用函数:无                                            *
***********************************************************/
BOOL UARTaddDataToTxBuff(uint8 Data)
{
    
    SAFE_CODE_PERFORMANCE
    (
        if ((UARTTxBuffHead == UARTTxBuffTail) 
         && (UARTTxBuffCounter == SERIAL_TX_BUFF_SIZE))
        {
            SEI();
            return FALSE;
        }
        UARTTxBuff[UARTTxBuffTail++] = Data;
    
        UARTTxBuffCounter ++;
    
        if (UARTTxBuffTail == SERIAL_TX_BUFF_SIZE)
        {
            UARTTxBuffTail = 0;
        }
	)	
    return TRUE;
} 

#ifdef _USE_SERIAL_TX_TRANSMITTER_PROC
/***********************************************************
*   函数说明:串行发送进程                                 *
*   输入:    无                                           *
*   输出:    是否继续执行                                 *
*   调用函数:UARTgetDataFromTxBuff()                      *
***********************************************************/
BOOL PROC_Serial_Transmitter(void)
{
    uint8 cTransmitByte = 0;
    
    SAFE_CODE_PERFORMANCE
    (
        if (g_bIfSerialTransmitCompleted)
        {
            if (!UARTgetDataFromTxBuff(&cTransmitByte))
            {
                SEI();
                SERIAL_DISABLE_WRITE
                return TRUE;
            }
            else
            {
                SERIAL_ENABLE_WRITE
            }
            g_bIfSerialTransmitCompleted = FALSE;
            UDR_PORT = cTransmitByte;
        }
    )
    
    return TRUE;
}
#endif

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -