1 Star 0 Fork 9

liguss / 通用命令行接口

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

通用嵌入式跨平台命令行接口(GM_CLI)


-------------------------------------------------
[GM CLI] > help test
-------------------------------------------------

-------------------------------------------------

-------------------------------------------------

特性

  1. 带有命令导出功能,修改添加命令无需修改命令行相关代码,只需要导出新的命令即可
  2. 支持命令重命名,可以使用英文符号作为命令名来精简指令
  3. 带有历史记录功能,用户可以配置记录条数
  4. 带有命令自动补全功能,输入时更加的方便快捷
  5. 代码占用少,执行效率高,无其他模块依赖
  6. 采用回调机制,用户只需要集中精力在命令的实现上,无需自己解析命令
  7. 带有系统默认命令,可以快速的查询和测试CLI系统
  8. 字符的发送采用注册机制,用户可以进行重定向和文件操作,完全自定义
  9. 字符的接收完全用户决定,可以进行文件操作或流读取,可以轻松实现脚本解释器的功能
  10. 支持静态命令注册功能,只需要用户定义一个全局数组即可
  11. 支持多种编译器自动识别生成相应的命令导出宏

计划

  1. 添加参数的自动补全功能
  2. 添加模仿Linux命令的可选参数和复合参数等功能
  3. 添加函数执行指令,便于代码调试

使用说明

  1. 准备一个工程,带有字符输入输出功能或模拟数据输入输出功能即可
  2. 下载此代码到工程源码目录
  3. 添加 gm_cli.c 文件到工程,具体添加方式不同编译器不同
  4. 添加 gm_cli.h 所在的目录到编译头文件包含目录,具体添加方式不同编译器不同
  5. 采用静态命令注册功能需要在用户源文件定义如下数组,注意结尾一定要全部为NULL
/* 静态命令表 */
const gm_cli_cmd_t gm_cli_static_cmds[] =
{
    {
        .name  = "help",
        .usage = "help [cmd-name] -- list the command and usage",
        .cb    = gm_cli_internal_cmd_help,
        .link  = NULL,
    },
    {
        .name  = "?",
        .usage = NULL,
        .cb    = NULL,
        .link  = &gm_cli_static_cmds[0],
    },
    {
        .name  = "history",
        .usage = "history [num] -- list the history command",
        .cb    = gm_cli_internal_cmd_history,
        .link  = NULL,
    },
    {
        .name  = "test",
        .usage = "test [args] -- test the cli",
        .cb    = gm_cli_internal_cmd_test,
        .link  = NULL,
    },
    /* 下面添加自己的命令 */
    {
        .name  = "xxx",
        .usage = "xxx",
        .cb    = xxx_cb,
        .link  = xxx,
    },
    ......

    /* 数组末尾一定要以下面的元素结束 */
    {
        .name  = NULL,
        .usage = NULL,
        .cb    = NULL,
        .link  = NULL,
    },
};
  1. 编译代码,解决一些因编译器不同产生的错误或警告,如有没法解决的错误或警告,请查询编译器手册或发起issue到本代码库
  2. main函数while之前或主任务运行之前添加如下初始化代码(your_out_char_cb需要填入自己的字符输出驱动;your_prompt需要填入自定义的提示符,不调用此函数系统采用默认的提示符)
/* 初始化CLI管理器 */
gm_cli_mgr_init();
/* 注册输出驱动 */
gm_cli_set_out_char_cb((gm_cli_out_char_cb_t*)your_out_char_cb);
/* 设置提示符 */
gm_cli_set_cmd_prompt("[your_prompt] > ");
/* 启动CLI */
gm_cli_start();
  1. 初始化后先采用如下代码测试CLI是否正常
const char str[] = "test 1 2 3\n";
unsigned int len = (unsigned int)strlen(str);
unsigned int i;
for (i = 0; i < len; i++)
{
    gm_cli_parse_char(str[i]);
}

如果输出如下表示CLI正常

cmd  -> test
arg1 -> 1
arg2 -> 2
arg3 -> 3
  1. main函数while中或主任务或建立一个CLI任务,执行以下代码(_kbhit替换成自己的字符输入检测函数,_getch替换成自己的子符读取函数)
/* 键盘检测或数据队列查询等 */
if (_kbhit())
{
    /* 读取字符 */
    ch = _getch();
    /* 解析字符 */
    gm_cli_parse_char((char)ch);
}
  1. 编译代码,下载或进入调试,打开相应数据输入终端,按回车键查看是否有提示符输出,可以输入testhelp指令检测CLI是否正常

添加命令

  1. 命名回调函数格式如下:
int command_callback(int argc, char* argv[]);

argc - 表示输入的命令行命令和参数的总个数,含有命令本身,所以此参数最小值为1

argv - 表示命令参数的内容,采用指针存放,类型都是char型的指针即字符串地址

  1. 实现回调函数后只需要执行如下的导出命令即可
GM_CLI_CMD_EXPORT(command_name, "command_usage_string", command_callback);

如果需要给这个命令设置别名,可在上面的指令后再使用以下命令(可重复使用设置多个别名)

GM_CLI_CMD_ALIAS(command_name, "command_alias");

command_name - 命令的名字,这个名字就是命令的识别名,输入搜索的就是这个名字(不要加双引号,不能有空格等其它特殊字符)

command_usage_string - 命令的使用说明字符串,用于help命令给用户提示使用说明(需要加双引号,可以包含特殊字符,控制字符注意转义)

command_callback - 命令回调函数

command_alias - 命令别名字符串(需要加双引号,可以包含特殊字符,但不能包含空格和控制字符,必须是可显示字符)

  1. 编译代码,下载调试即可使用此命令,命令详细使用说明可输入help command_name查看,也可直接使用help查看系统当前支持的所有命令

默认命令

命令名 别名 使用说明 作用
help ? help 列出全部已注册的命令
help [cmd] 列出指定命令的详细说明
history history 查看全部存储的历史记录
history [num] 查看指定数量的历史记录
test test [...] 测试CLI系统是否正常,后接可变长任意参数

分支描述

分支 描述
master 初版命令行,支持VS/IAR/KEIL编译器,采用驼峰命名法,不支持静态命令注册,下一版会和develop分支合并
develop 开发中命令行,主线版本,采用linux的全小写命名法,支持更多的编译器,支持静态命令注册,支持和计划支持更多新特性
static-reg-cmd master分支上添加静态命令注册方式,由于master分支之后会被develop分支合并取代,所以独立一个分支,提供给功能需求较少和容量有限的单片机使用

特别感谢

用户名 开源地址首页 贡献内容
徐煜 https://gitee.com/dog_who_loves_cat_mint static-reg-cmd分支添加命令静态注册方式

特殊说明

大家有什么建议或疑问请邮件或直接在仓库进行留言,谢谢大家的参与和代码的共同维护,也希望大家将自己的优秀的计划加入代码中并发出pull request

MIT License Copyright (c) 2018-2021 付瑞彪 All Rights Reserved Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

通用命令行接口,适合嵌入式系统的调试和参数整定 展开 收起
C
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C
1
https://gitee.com/liguss/gm_cli.git
git@gitee.com:liguss/gm_cli.git
liguss
gm_cli
通用命令行接口
develop

搜索帮助