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;
}
#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的值,是这意思么?所以要是我理解错了,,那我就谢罪吧
大同小异啦~~~还有没有其他不同的框架贡献一下呀~
我也觉得超棒的
这类结构, 通常是以enum作为函数对应的index, 而命令的函数定义成一函数数组。
一周热门 更多>