這取決於你想要得到多少奇特,有多少不同的命令,以及是否可能經常添加新命令。
您可以創建一個數據結構,將每個有效的命令字符串與相應的函數指針相關聯 - 使用bsearch()
訪問的排序列表可能沒有問題,儘管散列表可能具有更好的性能(因爲有效的命令是事先知道的,你可以使用像gperf
這樣的工具來構建完美的哈希)。
的bsearch()
方法可能是這個樣子:
void func_aa(char args[11]);
void func_cc(char args[11]);
void func_xy(char args[11]);
struct command {
char *name;
void (*cmd_func)(char args[11]);
} command_tbl[] = {
{ "AA", func_aa },
{ "CC", func_cc },
{ "XY", func_xy }
};
#define N_CMDS (sizeof command_tbl/sizeof command_tbl[0])
static int comp_cmd(const void *c1, const void *c2)
{
const struct command *cmd1 = c1, *cmd2 = c2;
return memcmp(cmd1->name, cmd2->name, 2);
}
static struct command *get_cmd(char *name)
{
struct command target = { name, NULL };
return bsearch(&target, command_tbl, N_CMDS, sizeof command_tbl[0], comp_cmd);
}
然後,如果你有command_str
指向從串口一個字符串,你可以這樣做派遣合適的功能:
struct command *cmd = get_cmd(command_str + 1);
if (cmd)
cmd->cmd_func(command_str);
來源
2010-08-23 08:18:38
caf
謝謝! 你和shodanex的答案對我來說是最有用的。 有限狀態機似乎是正確的選擇,儘管它不像模塊化方法那麼直觀。 而且,是的,ASCII接口很醜。不是我的選擇:P – Pav 2010-08-26 06:18:51