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

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条回答
美丽的时光机器
1楼-- · 2019-07-22 01:49
nashui_sx 发表于 2019-4-19 17:46
我错了

错误无效~~~
nashui_sx
2楼-- · 2019-07-22 04:04
323232
3楼-- · 2019-07-22 05:56
我觉得你把简单的问题复杂化了.....
设值 UINT1=0;UINT2=6;CMD1=0;CMD2=3;SUBCMD1=1;SUBCMD2=2;SUBCMD3=3;
将上位机发来的单元号、命令和子命令加起来....就得到了你所需要调用的函数.....(题目没看懂,程序看懂了)
我觉得楼主是一种可以靠脸吃饭,却非要靠才华的人
323232
4楼-- · 2019-07-22 09:12
323232 发表于 2019-4-19 20:03
我觉得你把简单的问题复杂化了.....
设值 UINT1=0;UINT2=6;CMD1=0;CMD2=3;SUBCMD1=1;SUBCMD2=2;SUBCMD3=3; ...

UINT3=12;
美丽的时光机器
5楼-- · 2019-07-22 10:32
 精彩回答 2  元偷偷看……
美丽的时光机器
6楼-- · 2019-07-22 11:24
323232 发表于 2019-4-19 20:03
我觉得你把简单的问题复杂化了.....
设值 UINT1=0;UINT2=6;CMD1=0;CMD2=3;SUBCMD1=1;SUBCMD2=2;SUBCMD3=3; ...

集美貌与才华与一身的。。。媛儿~~

一周热门 更多>