Go to file
hqm afb1ef7a51 添加了xmcd prompt的颜色以及一些其他的小修改 2021-10-11 21:50:24 +08:00
.vscode 修改解释器关于显示部分的函数 2021-09-17 23:21:46 +08:00
doc 添加了一个图片 2021-09-18 19:39:44 +08:00
example 修改了key的处理方式 2021-10-08 21:56:04 +08:00
extensions 添加了xmcd prompt的颜色以及一些其他的小修改 2021-10-11 21:50:24 +08:00
inc 添加了xmcd prompt的颜色以及一些其他的小修改 2021-10-11 21:50:24 +08:00
src 添加了xmcd prompt的颜色以及一些其他的小修改 2021-10-11 21:50:24 +08:00
.gitignore 修改ignore file 2021-09-29 22:22:57 +08:00
LICENSE 添加了arduino例子,整理了xcmd源码 2021-09-17 14:31:12 +08:00
README.md 增加命令执行的返回值 2021-10-10 17:20:22 +08:00

README.md

xcmd

效果展示

输入图片说明

介绍

xcmd是一款单片机命令行工具移植十分方便并且对flash与ram占用很小旨在为单片机提供一个能够快速搭建且占用资源很小的命令行工具可以大大加快单片机程序调试工作它有一下几个优点。

  1. 移植十分简单
  2. 资源占用约8K rom 1K ram
  3. 支持历史记录
  4. 支持命令自动补全
  5. 支持注册快捷键

支持的平台

  1. linux
  2. arduino
  3. stm32

测试过的串口软件

  1. SecureCRT请设置成Xterm模式
  2. 推荐putty
  3. 推荐MobaXterm
  4. Xshell

移植

  • 移植十分简单,只需要在初始化的时候提供字符输入输出函数即可
    /* 例如移植到linux平台 */
    int cmd_get_char(uint8_t *ch)
    {
        *ch = getch();
        return 1;
    }

    int cmd_put_char(uint8_t ch)
    {
        putchar(ch);
        return 1;
    }

    int main(void)
    {
        /*调用初始化函数的时候传入字符输入输出函数*/
        xcmd_init(cmd_get_char, cmd_put_char);
        while(1)
        {
            xcmd_task();
        }
    }
/* 例如移植到Arduino平台 */
int cmd_get_char(uint8_t *ch)
{
    if(Serial.available())
    {
        *ch =  Serial.read();
        return 1;
    }
    else
    {
        return 0;
    }
}

int cmd_put_char(uint8_t ch)
{
    Serial.write(ch);
    return 1;
}

void setup() {
    Serial.begin(115200);
    xcmd_init(cmd_get_char, cmd_put_char);
}

void loop() {
    
    xcmd_task();
}

配置

配置文件位于src/xcmd_config.h

#define XCMD_LINE_MAX_LENGTH    (32) /* 命令行支持的最大字符数 */
#define XCMD_HISTORY_MAX_NUM    (8)  /* 支持的历史记录个数0为不支持 */
#define XCMD_PARAM_MAX_NUM      (4)  /* 支持输入的参数个数 */

使用说明

注册自定义命令
static int cmd_echo(int argc, char* argv[])
{
    if(param_check(1, argc, argv))
	{
    	printf("%s\r\n", argv[1]);
	}
    return 0;
}

static int cmd_example(int argc, char* argv[])
{
    uint8_t i;
    if(param_check(1, argc, argv))
	{
		if(strcmp(argv[1], "str") == 0)
		{
			for(i=2; i<argc; i++)
		    {
		    	printf("%s\r\n", argv[i]);
			}
		}
		if(strcmp(argv[1], "int") == 0)
		{
			for(i=2; i<argc; i++)
		    {
		    	printf("%d\r\n", atoi(argv[i]));
			}
		}
		if(strcmp(argv[1], "float") == 0)
		{
			for(i=2; i<argc; i++)
		    {
		    	printf("%f\r\n", atof(argv[i]));
			}
		}
	}
    return 0;
}

static xcmd_t cmds[] = 
{
    {"echo", cmd_echo, "print anything", NULL},
    {"example", cmd_example, "example [-f|-i|-s] [val]", NULL},
};

void test_cmd_init(void)
{
    xcmd_register(cmds, sizeof(cmds)/sizeof(xcmd_t));
}
注册自定义快捷键
int cmd_ctr_a(void* pv)
{
    printf("this is ctr+a\n");
}

int cmd_ctr_c(void* pv)
{
    exit(0);
}

static xcmd_key_t user_keys[] = 
{
    {KEY_CTR_A, cmd_ctr_a, "ctr+a", NULL},
    {KEY_CTR_C, cmd_ctr_c, "ctr+c", NULL},
};

void test_keys_init(void)
{
    xcmd_key_register(user_keys, sizeof(user_keys)/sizeof(xcmd_key_t));
}

其他

流程图需要使用drawio来打开可以使用vscode drawio的插件来打开

计划

仿照linux终端添加扩展快捷键
  1. 添加ctr+left和ctr+right快捷键已完成
  2. 添加ctr+a、ctr+e、ctr+u、ctr+k、ctr+l快捷键(已完成)
添加终端颜色/字体控制扩展(已完成)
修改xcmd_get_param函数(已完成)
  1. 替换strtok函数为其他可复用函数
  2. 增加对“”的支持
增加socket相关扩展
  1. tcp client/service
  2. udp client/service已完成
  3. udp 广播
  4. udp 组播
增加操作系统支持
  1. linux (demo only for linux example)
  2. FreeRTOS (demo only for esp32)