最优雅的方式来存储串口设备的字符串命令?

时间:2012-08-26 09:18:05

标签: c serial-port

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

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

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

或人类可读:

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

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

3 个答案:

答案 0 :(得分: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]等仍然可以获得可读性。

答案 1 :(得分:1)

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

e.g。

#DEFINE cmd_start 0
#DEFINE cmd_stop 1

所以可以使用cmd_msgs[cmd_start]

所以我会选择第二个选项

char* cmd_start_str = "start";

答案 2 :(得分: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)
{
     ...
}

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