📄 rd_useserialframe_proc._c
字号:
/***********************************************************
* 函数库说明:串行通信数据帧处理函数函数库 *
* 版本: v1.00 *
* 作者: 王卓然 *
* 创建日期: 2007年4月6日 *
* -------------------------------------------------------- *
* [支 持 库] *
* 支持库名称:LIB_Config.h *
* 需要版本: ----- *
* 支持库说明:库函数配置声明库 *
* *
* 支持库名称:RD_MacroAndConst.h *
* 需要版本: v0.01 &abv *
* 支持库说明:系统常用宏定义库 *
* *
* 支持库名称:RD_UseSerialFrame_PROC.h *
* 需要版本: ----- *
* 支持库名称:串行通信数据帧处理函数声明库 *
* -------------------------------------------------------- *
* [版本更新] *
* 修改: *
* 修改日期: *
* 版本: *
* -------------------------------------------------------- *
* [版本历史] *
* -------------------------------------------------------- *
* [使用说明] *
***********************************************************/
/********************
* 头 文 件 配 置 区 *
********************/
# include "RD_MacroAndConst.h"
# include "RD_UseSerialFrame_PROC.h"
# include "RD_ADT_QUEUE.h"
# include "RD_ADT_MSGMap.h"
# include "RD_UseBits.h"
/********************
* 系 统 宏 定 义 *
********************/
/*------------------*
* 常 数 宏 定 义 *
*------------------*/
/*------------------*
* 动 作 宏 定 义 *
*------------------*/
# define SFP_ACTION_FLAG SET_BIT8_FORMAT(cTempActionFlag)
# define SFP_STOP_ALL_ACTION cTempActionFlag = NULL;
# define SFP_WAIT_FOR_FRAME_HEAD SFP_ACTION_FLAG.BIT0
# define SFP_WAIT_FOR_FRAME_SIZE SFP_ACTION_FLAG.BIT1
# define SFP_WAIT_FOR_ALL_DATA SFP_ACTION_FLAG.BIT2
/********************
* 用户变量类型定义 *
********************/
/********************
* 结构体定义区 *
********************/
/********************
* 模块函数声明区 *
********************/
static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP);
/********************
* 全局函数声明区 *
********************/
void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP);
BOOL SFP_NULL_Output_Data_Function(uint8 cData);
BOOL SFP_NULL_Input_Data_Function(uint8 *pData);
BOOL SFP_NULL_Peek_Data_Function(uint8 *pData);
BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
uint8 cCMD,uint8 *pMSG,uint8 Length);
/********************
* 模块变量声明区 *
********************/
/********************
* 全局变量声明区 *
********************/
/***********************************************************
* 函数说明:数据输出空函数 *
* 输入: 数据 *
* 输出: FALSE *
* 调用函数:无 *
***********************************************************/
BOOL SFP_NULL_Output_Data_Function(uint8 cData)
{
uint8 *p = &cData;
return FALSE;
}
/***********************************************************
* 函数说明:数据输入空函数 *
* 输入: 指针 *
* 输出: FALSE *
* 调用函数:无 *
***********************************************************/
BOOL SFP_NULL_Input_Data_Function(uint8 *pData)
{
(*pData) = NULL;
return FALSE;
}
/***********************************************************
* 函数说明:数据察看空函数 *
* 输入: 指针 *
* 输出: FALSE *
* 调用函数:无 *
***********************************************************/
BOOL SFP_NULL_Peek_Data_Function(uint8 *pData)
{
(*pData) = NULL;
return FALSE;
}
/***********************************************************
* 函数说明:串行通讯数据帧处理函数 *
* 输入: 要处理的数据帧结构指针 *
* 输出: 无 *
* 调用函数:SFP_Check_Frames() *
***********************************************************/
void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP)
{
uint8 cTempActionFlag = pSFP->cActionFlag;
uint8 cTempData = 0;
ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
if (!(*(pSFP->InputDataFunc))(&cTempData)) //利用函数指针调用函数
{
return ;
}
if (cTempActionFlag == NULL)
{
pSFP->cXORCheck = 0;
pSFP->cFrameSize = 0;
SFP_WAIT_FOR_FRAME_HEAD = TRUE;
}
if (SFP_WAIT_FOR_FRAME_HEAD)
{
if (cTempData == pSFP->cHeadByte)
{
ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData);
if (!(pSFP->cFixLength))
{
//变长数据帧
SFP_WAIT_FOR_FRAME_SIZE = TRUE;
}
else
{
//固定长度的数据帧
SFP_WAIT_FOR_ALL_DATA = TRUE;
pSFP->cFrameSize = pSFP->cFixLength;
}
SFP_WAIT_FOR_FRAME_HEAD = FALSE;
pSFP->cActionFlag = cTempActionFlag;
}
return ;
}
if (SFP_WAIT_FOR_FRAME_SIZE)
{
if (cTempData > (pQueue->nSize))
{
//错误的数据帧长度
ADT_QUEUE_LET_EMPTY((*pQueue)) //清空队列
SFP_STOP_ALL_ACTION
}
else
{
//有效的数据帧长度
pSFP->cFrameSize = cTempData; //更新数据帧长度信息
pSFP->cXORCheck ^= cTempData;
ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData); //将该信息添加到缓冲区
SFP_WAIT_FOR_ALL_DATA = TRUE;
SFP_WAIT_FOR_FRAME_SIZE = FALSE;
}
pSFP->cActionFlag = cTempActionFlag;
return ;
}
if (SFP_WAIT_FOR_ALL_DATA)
{
if ((pQueue->nCount) < (pSFP->cFrameSize))
{
pSFP->cXORCheck ^= cTempData;
ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData); //将该信息添加到缓冲区
}
if ((pQueue->nCount) == ((pSFP->cFrameSize) - 1))
{
if (pSFP->cXORCheck)
{
//XOR校验错误
//错误的数据帧长度
ADT_QUEUE_LET_EMPTY((*pQueue)) //清空队列
SFP_STOP_ALL_ACTION
pSFP->cActionFlag = cTempActionFlag;
return ;
}
else
{
//ReceiveData = cTempData;
}
}
else if ((pQueue->nCount) == (pSFP->cFrameSize))
{
//所有的数据都添加完成
if (cTempData == pSFP->cEndByte)
{
//获得了所有的数据,并且数据帧正确
SFP_Check_Frames(pSFP); //进行数据帧检测
}
ADT_QUEUE_LET_EMPTY((*pQueue)) //清空队列
SFP_STOP_ALL_ACTION
pSFP->cActionFlag = cTempActionFlag;
return ;
}
return ;
}
}
/***********************************************************
* 函数说明:数据帧提取检测函数 *
* 输入: 串行数据帧检测结构指针 *
* 输出: 无 *
* 调用函数:无 *
***********************************************************/
static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP)
{
uint8 n = 0;
MSG_ITEM *pMsgItem = &(pSFP->MsgItem);
ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
//将头部去除
ADT_GET_DATA_FROM_QUEUE((*pQueue),n);
//获取消息长度
if (!(pSFP->cFixLength))
{
ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->cDataLength));
pMsgItem->cDataLength -= 5;
}
else
{
pMsgItem->cDataLength = pSFP->cFixLength - 4;
}
//获取指令字
ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->cCMD));
for (n = 0;n < (pMsgItem->cDataLength);n++)
{
//依次获取所有数据
ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->pData[n]));
}
if (!MsgMapProcess(pSFP->pMsgMap,pMsgItem))
{
//信息未被正确处理
//有待添加代码
}
}
/***********************************************************
* 函数说明:消息发送函数 *
* 输入: 串行数据帧检测结构指针,指令,消息,消息长度 *
* 输出: TRUE *
* 调用函数:无 *
***********************************************************/
BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
uint8 cCMD,uint8 *pMSG,uint8 Length)
{
uint8 n = 0;
uint8 cXORCheck = 0;
(*(pSFP->OutputDataFunc))(pSFP->cHeadByte); //发送消息头部
if (!(pSFP->cFixLength))
{
(*(pSFP->OutputDataFunc))((Length+5)); //发送消息长度
cXORCheck ^= (Length + 5);
}
(*(pSFP->OutputDataFunc))(cCMD); //发送指令字节
cXORCheck ^= cCMD;
for (n = 0;n < Length;n++)
{
(*(pSFP->OutputDataFunc))(pMSG[n]); //发送消息本体
cXORCheck ^= pMSG[n];
}
(*(pSFP->OutputDataFunc))(cXORCheck); //发送校验字节
(*(pSFP->OutputDataFunc))(pSFP->cEndByte); //发送消息头部
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -