下位机针对命令帧查找执行函数,代码方法求助。

2019-07-21 02:27发布

1.问题描述:
我有这样一种想法,下位机分为很多个不同的模块,每个模块有自己的函数,如下代码数组所示,
UNIT1,UNIT2,UNIT3它们代表着不同的单元,每个单元下有不同的命令,Fun1~Fun18分别是它们的命令执行函数。
想通过上位机发送命令帧到下位机,命令帧包含了单元以及命令等信息,每个命令帧都对应一条执行函数.
调用FindExecFuncUnit去查找该条命令对应的执行函数。针对这样的情景,以下代码这是我的一种实现想法,
小伙伴们觉得这种写法怎么样,可不可取?或者有没有经验的前辈有更好的实现方式呢?
还麻烦给点建议或者有现成的框架可以参考一下,谢谢!
typedef struct _CMD_UNIT
{
   LOGIC_UNIT UNIT_NO;              
   uint8_t cmd;                           
   uint8_t subCmd;                  
   ParseRst     parseCmdFunc;      
}CMD_UNIT;

CMD_UNIT arr[][4] =
{
    {UNIT1, CMD1, SUBCMD1, Fun1},
    {UNIT1, CMD1, SUBCMD2, Fun2},
    {UNIT1, CMD1, SUBCMD3, Fun3},
    {UNIT1, CMD1, 0x00,    NULL},   //0x01主命令下没有这个命令

    {UNIT1, CMD2, SUBCMD1, Fun4},
    {UNIT1, CMD2, SUBCMD2, Fun5},
    {UNIT1, CMD2, SUBCMD3, Fun6},
    {UNIT1, CMD2, 0x00,    NULL},
    {UNIT1, 0x00, 0x00,    NULL},   //UNIT1单元下没有这个主命令
    /***********************************************/
    {UNIT2, CMD1, SUBCMD1, Fun7},
    {UNIT2, CMD1, SUBCMD2, Fun8},
    {UNIT2, CMD1, SUBCMD3, Fun9},
    {UNIT2, CMD1, 0x00,    NULL},

    {UNIT2, CMD2, SUBCMD1, Fun10},
    {UNIT2, CMD2, SUBCMD2, Fun11},
    {UNIT2, CMD2, SUBCMD3, Fun12},
    {UNIT2, CMD2, 0x00,    NULL},
    {UNIT2, 0x00, 0x00,    NULL},
    /***********************************************/
    {UNIT3, CMD1, SUBCMD1, Fun13},
    {UNIT3, CMD1, SUBCMD2, Fun14},
    {UNIT3, CMD1, SUBCMD3, Fun15},
    {UNIT3, CMD1, 0x00,    NULL},

    {UNIT3, CMD2, SUBCMD1, Fun16},
    {UNIT3, CMD2, SUBCMD2, Fun17},
    {UNIT3, CMD2, SUBCMD3, Fun18},
    {UNIT3, CMD2, 0x00,    NULL},
    {UNIT3, 0x00, 0x00,    NULL},
    /***********************************************/
    {0x00, 0x00, 0x00,     NULL} //0x00未知单元
};


ParseRst FindExecFuncUnit(PSTD_CMD pCmd)
{
    PCMD_FUNCTION_INFO pInfo = (PCMD_FUNCTION_INFO)pCmd;
    uint8_t i;

    for(i = 0; pInfo->Unit != 0x00; i++)               
    {
        if((pInfo->Cmd == arr[i][1]) && pInfo->SubCmd == arr[i][2]))
        {
            if((arr[i][1] != 0x00) && (arr[i][2] != 0x00))
                return return arr[i][3];
            else
                return NULL;
        }
    }

    return NULL;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。