xcmd/README.md

5.1 KiB
Executable File
Raw Permalink Blame History

xcmd

English Versions

效果展示

输入图片说明

介绍

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

  1. 移植十分简单
  2. 资源占用很小
  3. 支持历史记录
  4. 支持命令自动补全
  5. 支持注册快捷键
  6. 支持 xcmd_cmd_register()/xcmd_key_register方法注册命令或按键
  7. 支持 XCMD_EXPORT_CMD()/XCMD_EXPORT_KEY()方法直接导出命令或按键,不需要额外运行注册函数

支持的平台示例

  1. linux
  2. arduino
  3. esp32

测试过的串口软件

  1. win/linux推荐putty
  2. win推荐MobaXterm
  3. linux端推荐cu
  4. SecureCRT请设置成Xterm模式
  5. Xshell
  6. nc(支持性很差)
  7. minicom(支持性很差)

支持的扩展功能

  1. 类linux风格的快捷键ctr+left、ctr+right、ctr+a、ctr+e、ctr+u、ctr+k、ctr+l快捷键
  2. 支持字体、背景颜色显示
  3. 支持类linux的文件操作Fatfs文件系统ls、cd、rm、df、mv、mkdir、touch、rd、wr、cat
  4. 支持基于socket的udp server、udp client测试程序

移植

  • 移植十分简单可在example中查看各平台移植结果
  1. 在初始化的时候提供字符输入输出函数即可
  2. 从example中拷贝一个xcmd_confg.h到自己的项目
/* 例如移植到Arduino平台 */
#include "src/xcmd.h"
#include "arduino_xcmd.h"
#include <Arduino.h>

xcmder_t xcmder;

static int io_write(int fd, const char *buf, size_t len)
{
    Serial.write(buf, len);
    return len;
}

static int io_read(int fd, char *buf, size_t len)
{
    int  i=0;
    while (Serial.available() > 0)
    {
        buf[i++] = (char)Serial.read();
    }
    return i;
}

void setup() {
    Serial.begin(115200);
    xcmd_init(&xcmder, io_write, io_read);
}

void loop() {
    
    xcmd_task(&xcmder);
}

配置

配置xcmd_config.h

注意 如果不知道如何修改连接脚本建议不要使能ENABLE_XCMD_EXPORT。不使能ENABLE_XCMD_EXPORT的情况下有更好的兼容性移植更加简单

#ifndef XCMD_LINE_MAX_LENGTH
#define XCMD_LINE_MAX_LENGTH    (32) /* 命令行支持的最大字符数 */
#endif

#ifndef XCMD_PRINT_BUF_MAX_LENGTH
#define XCMD_PRINT_BUF_MAX_LENGTH   (64) /* xcmd_print缓存 */
#endif  

#ifndef  XCMD_HISTORY_BUF_SZIE
#define XCMD_HISTORY_BUF_SZIE    (64)  /* 支持的历史记录个数, 这个参数对内存的影响很大建议arduino设置为00为不支持 */
#endif

#ifndef XCMD_PARAM_MAX_NUM
#define XCMD_PARAM_MAX_NUM      (8)  /* 支持输入的参数个数 */
#endif

#if XCMD_PRINT_BUF_MAX_LENGTH <  (XCMD_LINE_MAX_LENGTH+32)
#undef XCMD_PRINT_BUF_MAX_LENGTH
#define XCMD_PRINT_BUF_MAX_LENGTH   (XCMD_LINE_MAX_LENGTH+32) /* xcmd_print缓存 */
#endif 

#ifndef XCMD_DEFAULT_PROMPT
#define XCMD_DEFAULT_PROMPT     "$ " /*提示符*/
#endif

#ifndef XCMD_DEFAULT_PROMPT_CLOLR
#define XCMD_DEFAULT_PROMPT_CLOLR   ANSI_BLUE /*提示符颜色*/
#endif

#ifndef XCMD_VAR_NUM
#define XCMD_VAR_NUM      (4)
#endif

#ifndef XCMD_VAR_NAME_BUF_SZIE
#define XCMD_VAR_NAME_BUF_SZIE      (32)
#endif

#ifndef XCMD_VAR_VAR_SZIE
#define XCMD_VAR_VAR_SZIE      (32)
#endif

#ifndef ENABLE_XCMD_EXPORT
//#define ENABLE_XCMD_EXPORT /*使能XCMD_EXPORT_CMD和XCMD_EXPORT_KEY*/
#endif

使用说明

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

static xcmd_t cmds[] = 
{
    {"echo", cmd_echo, "print anything", NULL},
};

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

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

void test_keys_init(void)
{
    xcmd_key_register(user_keys, sizeof(user_keys)/sizeof(xcmd_key_t));
}
XCMD_EXPORT_CMD()方法注册自定义命令需要使能宏ENABLE_XCMD_EXPORT并修改ldsexample/stm32/qemu/demos/main.ld
static int cmd_echo(int argc, char* argv[])
{
    if(param_check(1, argc, argv))
	{
    	printf("%s\r\n", argv[1]);
	}
    return 0;
}
XCMD_EXPORT_CMD(echo, cmd_echo, "print anything")
XCMD_EXPORT_KEY() 方法注册自定义快捷键, 需要使能宏ENABLE_XCMD_EXPORT并修改ldsexample/stm32/qemu/demos/main.ld
int cmd_ctr_a(void* pv)
{
    printf("this is ctr+a\n");
}
XCMD_EXPORT_KEY(KEY_CTR_A, cmd_ctr_a, "ctr+a")

其他

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