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

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-22 17:23
美丽的时光机器 发表于 2019-4-22 08:29
集美貌与才华与一身的。。。媛儿~~

上位机应该就是发你这些单元拉 命令号 子命令号这些是么?那就按照事先定义好的这些,直接加起来不就是你要调用的任务号了么.....难道我理解错你的题目了吗
323232
2楼-- · 2019-07-22 21:31
323232 发表于 2019-4-22 10:59
上位机应该就是发你这些单元拉 命令号 子命令号这些是么?那就按照事先定义好的这些,直接加起来不就是你 ...

然后写一个有任务名字的一维数组,直接把任务号当做参数输入,也能达到效果吧....我是这么想的
美丽的时光机器
3楼-- · 2019-07-22 22:32
323232 发表于 2019-4-22 10:59
上位机应该就是发你这些单元拉 命令号 子命令号这些是么?那就按照事先定义好的这些,直接加起来不就是你 ...

感觉代码不直观~
美丽的时光机器
4楼-- · 2019-07-23 03:40
 精彩回答 2  元偷偷看……
323232
5楼-- · 2019-07-23 08:58
 精彩回答 2  元偷偷看……
323232
6楼-- · 2019-07-23 12:45
323232 发表于 2019-4-22 14:44
是的,但是代码量肯定少很多

甚至不用查找,加起来就是数组的序号了

一周热门 更多>