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

📄 rd_useserialframe_proc.c

📁 LCD1602键盘显示模块实例
💻 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_ADT_QUEUE.h"
# include "RD_ADT_MSGMap.h"
# include "RD_UseSerialFrame_PROC.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 + -