📄 rd_useserialbuff.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 + -