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

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;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
29条回答
323232
1楼-- · 2019-07-23 14:40
#DEFINE UINT1 0
#DEFINE UINT2 6
#DEFINE UINT3 12
#DEFINE CMD1  0
#DEFINE CMD2  3
#DEFINE SUBCMD1 1
#DEFINE SUBCMD2 2
#DEFINE SUBCMD3 3

uint8 Func_Num[18] ={func1,func2,func3,func4,func5,func6,func7,func8,func9,func10,func11,func12,func13,func14,func15,func16,func17,func18};
return Func_Num[UINT+CMD+SCMD-1];

上位机下发数据给UINT CMD SCMD附上面define的值,是这意思么?所以要是我理解错了,,那我就谢罪吧
美丽的时光机器
2楼-- · 2019-07-23 14:55
323232 发表于 2019-4-22 14:52
#DEFINE UINT1 0
#DEFINE UINT2 6
#DEFINE UINT3 12

大同小异啦~~~还有没有其他不同的框架贡献一下呀~
csmjmcc
3楼-- · 2019-07-23 18:40
 精彩回答 2  元偷偷看……
323232
4楼-- · 2019-07-23 19:07
csmjmcc 发表于 2019-4-22 16:16
我觉得,这个程序架构挺好的。

我也觉得超棒的
美丽的时光机器
5楼-- · 2019-07-23 20:24
 精彩回答 2  元偷偷看……
edmund1234
6楼-- · 2019-07-24 02:06
是搞复杂了,但思路是可行的,除了函数作为传送命令这一条, 不应该也可以直接把函数放在命令里的, 因为所谓函数, 它是一个地址, 这个地址是编译器在编译时动态生成的, 你让上位机把函数的地址发给下位机, 那就是说每次下位机编译后, 你都要把函数的地址抄一份给上位机。

这类结构, 通常是以enum作为函数对应的index, 而命令的函数定义成一函数数组。

一周热门 更多>