1

假设我正在与串行端口设备通信,并且有大量命令 (74) 用于控制此类设备。存储和使用它们的最佳方式是什么?

当然,我可以通过以下方式组织它们:

static char *cmd_msgs[] =
{
    "start",
    "stop",
    "reset",
    "quit",
    "",
    "",
    "",
    "",
    ...
};

或人类可读:

char cmd_start_str[] = "start";
...
char cmd_quit_str[] = "quit";

有人可以指出处理此类任务的工作示例吗?

4

3 回答 3

5

第一种方法很好——不要使用很多具有唯一名称的全局变量,它们很难引用,尤其是当你想循环它们时。这就是字符串数组的用途(您的第一种方式)。如果您想要人类可读的代码(您应该想要),请使用一个合理命名的枚举,其值对应于实际的命令字符串。所以做类似的事情

const char *cmds[] = {
    "command 1",
    "command 2",
    "Print Hello World",
    "Explode House"
};

enum {
    COMMAND_ONE,
    COMMAND_TWO,
    COMMAND_SAYHELLO,
    COMMAND_BOOM
};

cmds[COMMAND_SAYHELLO]这样,您可以通过索引数组轻松地引用您的命令,但您仍然可以通过编写等来获得可读性。

于 2012-08-26T09:24:04.743 回答
1

如果您使用第一个选项,您通常需要第二组常量或 #defines 来定义数组中每个字符串的偏移量:

例如

#DEFINE cmd_start 0
#DEFINE cmd_stop 1

所以可以使用 cmd_msgs[cmd_start]

所以我会选择你的第二个选择

char* cmd_start_str = "start";
于 2012-08-26T09:27:07.960 回答
0

对于这个应用程序,我会使用一个结构数组。

// Command handler signature. Choose as per your requirement.
    typedef int (*cmdHandlerType)(char * hostCmdString); 

    //Command Structure
    typedef struct
    {
        char *commandString; /**< points to the Command String*/
        cmdHandlerType cmdHandler; /**< points to the Command function*/
    } commandStruct;

    //All the commands and its functions
    static commandStruct  Commands[] = {
                            {"TEMP", TempCommand},
                            {"GAIN",   GainCommand}, 
                            {"SETPT", SetPtCommand},
                            {"...", ... },
                         };
int TempCommand( char *str)
{
     ...
}

这样,当您从主机获取命令时,您可以匹配命令字符串并调用相应的处理程序。

于 2012-08-26T09:40:24.620 回答