2021-09-12 18:11:20 +08:00
|
|
|
|
# xcmd
|
2023-06-27 22:49:22 +08:00
|
|
|
|
[English Version](./README.en.md)s
|
2021-09-30 10:31:02 +08:00
|
|
|
|
#### 效果展示
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-30 10:31:02 +08:00
|
|
|
|
![输入图片说明](https://images.gitee.com/uploads/images/2021/0922/220957_66faa768_1680380.gif "演示1.gif")
|
|
|
|
|
|
2021-09-12 18:11:20 +08:00
|
|
|
|
#### 介绍
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-20 22:40:13 +08:00
|
|
|
|
xcmd是一款单片机命令行工具,移植十分方便,并且对flash与ram占用很小,旨在为单片机提供一个能够快速搭建且占用资源很小的命令行工具,可以大大加快单片机程序调试工作,它有一下几个优点。
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-20 22:40:13 +08:00
|
|
|
|
1. **移植十分简单**
|
2022-08-12 22:42:58 +08:00
|
|
|
|
2. **资源占用很小**
|
|
|
|
|
3. **支持历史记录**
|
2022-08-07 20:08:40 +08:00
|
|
|
|
4. **支持命令自动补全**
|
2022-08-12 22:42:58 +08:00
|
|
|
|
5. **支持注册快捷键**
|
|
|
|
|
6. **支持 `xcmd_cmd_register()/xcmd_key_register`方法注册命令或按键**
|
|
|
|
|
7. **支持 `XCMD_EXPORT_CMD()/XCMD_EXPORT_KEY()`方法直接导出命令或按键,不需要额外运行注册函数**
|
|
|
|
|
|
2023-06-27 22:49:22 +08:00
|
|
|
|
#### 支持的平台示例
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-17 23:31:13 +08:00
|
|
|
|
1. linux
|
|
|
|
|
2. arduino
|
2023-06-27 22:49:22 +08:00
|
|
|
|
3. esp32
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-20 20:50:17 +08:00
|
|
|
|
#### 测试过的串口软件
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2022-08-07 20:08:40 +08:00
|
|
|
|
2. (win/linux推荐)putty
|
|
|
|
|
3. (win推荐)MobaXterm
|
2022-08-12 22:42:58 +08:00
|
|
|
|
4. (linux端推荐)cu
|
|
|
|
|
5. SecureCRT:请设置成Xterm模式
|
|
|
|
|
6. Xshell
|
|
|
|
|
7. nc(支持性很差)
|
|
|
|
|
8. minicom(支持性很差)
|
|
|
|
|
|
2021-10-27 10:30:14 +08:00
|
|
|
|
#### 支持的扩展功能
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-10-27 10:30:14 +08:00
|
|
|
|
1. 类linux风格的快捷键:ctr+left、ctr+right、ctr+a、ctr+e、ctr+u、ctr+k、ctr+l快捷键
|
|
|
|
|
2. 支持字体、背景颜色显示
|
2022-08-12 22:42:58 +08:00
|
|
|
|
3. 支持类linux的文件操作(Fatfs文件系统):ls、cd、rm、df、mv、mkdir、touch、rd、wr、cat
|
2021-10-27 10:30:14 +08:00
|
|
|
|
4. 支持基于socket的udp server、udp client测试程序
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-12 18:34:00 +08:00
|
|
|
|
#### 移植
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2022-08-07 20:08:40 +08:00
|
|
|
|
- 移植十分简单,可在example中查看各平台移植结果
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2022-08-07 20:08:40 +08:00
|
|
|
|
1. 在初始化的时候提供字符输入输出函数即可
|
|
|
|
|
2. 从example中拷贝一个xcmd_confg.h到自己的项目
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-17 14:41:38 +08:00
|
|
|
|
```C
|
|
|
|
|
/* 例如移植到Arduino平台 */
|
2023-06-27 22:49:22 +08:00
|
|
|
|
#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)
|
2021-09-17 14:41:38 +08:00
|
|
|
|
{
|
2023-06-27 22:49:22 +08:00
|
|
|
|
Serial.write(buf, len);
|
|
|
|
|
return len;
|
2021-09-17 14:41:38 +08:00
|
|
|
|
}
|
2021-09-12 18:34:00 +08:00
|
|
|
|
|
2023-06-27 22:49:22 +08:00
|
|
|
|
static int io_read(int fd, char *buf, size_t len)
|
2021-09-17 14:41:38 +08:00
|
|
|
|
{
|
2023-06-27 22:49:22 +08:00
|
|
|
|
int i=0;
|
|
|
|
|
while (Serial.available() > 0)
|
|
|
|
|
{
|
|
|
|
|
buf[i++] = (char)Serial.read();
|
|
|
|
|
}
|
|
|
|
|
return i;
|
2021-09-17 14:41:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setup() {
|
|
|
|
|
Serial.begin(115200);
|
2023-06-27 22:49:22 +08:00
|
|
|
|
xcmd_init(&xcmder, io_write, io_read);
|
2021-09-17 14:41:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void loop() {
|
2023-06-27 22:49:22 +08:00
|
|
|
|
|
|
|
|
|
xcmd_task(&xcmder);
|
2021-09-17 14:41:38 +08:00
|
|
|
|
}
|
2023-06-27 22:49:22 +08:00
|
|
|
|
|
2021-09-17 14:41:38 +08:00
|
|
|
|
```
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-17 14:41:38 +08:00
|
|
|
|
#### 配置
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2022-08-07 20:08:40 +08:00
|
|
|
|
配置xcmd_config.h
|
|
|
|
|
|
|
|
|
|
**注意**: 如果不知道如何修改连接脚本,建议不要使能ENABLE_XCMD_EXPORT。不使能ENABLE_XCMD_EXPORT的情况下有更好的兼容性移植更加简单
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-17 14:41:38 +08:00
|
|
|
|
```C
|
2023-06-27 22:49:22 +08:00
|
|
|
|
#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设置为0,0为不支持 */
|
|
|
|
|
#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
|
2021-09-17 14:41:38 +08:00
|
|
|
|
```
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-12 18:11:20 +08:00
|
|
|
|
#### 使用说明
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2022-08-07 20:08:40 +08:00
|
|
|
|
##### xcmd_register()方法注册自定义命令
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-12 18:34:00 +08:00
|
|
|
|
```C
|
2021-10-10 17:20:22 +08:00
|
|
|
|
static int cmd_echo(int argc, char* argv[])
|
2021-09-12 18:34:00 +08:00
|
|
|
|
{
|
|
|
|
|
if(param_check(1, argc, argv))
|
|
|
|
|
{
|
|
|
|
|
printf("%s\r\n", argv[1]);
|
|
|
|
|
}
|
2021-10-10 17:20:22 +08:00
|
|
|
|
return 0;
|
2021-09-12 18:34:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static xcmd_t cmds[] =
|
|
|
|
|
{
|
2021-09-17 14:41:38 +08:00
|
|
|
|
{"echo", cmd_echo, "print anything", NULL},
|
2021-09-12 18:34:00 +08:00
|
|
|
|
};
|
|
|
|
|
|
2021-09-17 14:41:38 +08:00
|
|
|
|
void test_cmd_init(void)
|
2021-09-12 18:34:00 +08:00
|
|
|
|
{
|
2022-08-06 13:05:37 +08:00
|
|
|
|
xcmd_cmd_register(cmds, sizeof(cmds)/sizeof(xcmd_t));
|
2021-09-12 18:34:00 +08:00
|
|
|
|
}
|
|
|
|
|
```
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2022-08-07 20:08:40 +08:00
|
|
|
|
##### xcmd_key_register() 方法注册自定义快捷键
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-12 18:34:00 +08:00
|
|
|
|
```C
|
|
|
|
|
int cmd_ctr_a(void* pv)
|
|
|
|
|
{
|
|
|
|
|
printf("this is ctr+a\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static xcmd_key_t user_keys[] =
|
|
|
|
|
{
|
2021-10-08 21:58:28 +08:00
|
|
|
|
{KEY_CTR_A, cmd_ctr_a, "ctr+a", NULL},
|
2021-09-12 18:34:00 +08:00
|
|
|
|
};
|
|
|
|
|
|
2021-09-17 14:41:38 +08:00
|
|
|
|
void test_keys_init(void)
|
2021-09-12 18:34:00 +08:00
|
|
|
|
{
|
2021-09-17 14:41:38 +08:00
|
|
|
|
xcmd_key_register(user_keys, sizeof(user_keys)/sizeof(xcmd_key_t));
|
2021-09-12 18:34:00 +08:00
|
|
|
|
}
|
|
|
|
|
```
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
|
|
|
|
##### XCMD_EXPORT_CMD()方法注册自定义命令,需要使能宏ENABLE_XCMD_EXPORT并修改lds,见 `example/stm32/qemu/demos/main.ld`
|
|
|
|
|
|
2022-08-07 20:08:40 +08:00
|
|
|
|
```C
|
|
|
|
|
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")
|
|
|
|
|
```
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
|
|
|
|
##### XCMD_EXPORT_KEY() 方法注册自定义快捷键, 需要使能宏ENABLE_XCMD_EXPORT并修改lds,见 `example/stm32/qemu/demos/main.ld`
|
|
|
|
|
|
2022-08-07 20:08:40 +08:00
|
|
|
|
```C
|
|
|
|
|
int cmd_ctr_a(void* pv)
|
|
|
|
|
{
|
|
|
|
|
printf("this is ctr+a\n");
|
|
|
|
|
}
|
|
|
|
|
XCMD_EXPORT_KEY(KEY_CTR_A, cmd_ctr_a, "ctr+a")
|
|
|
|
|
```
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-12 22:26:20 +08:00
|
|
|
|
#### 其他
|
2022-08-12 22:42:58 +08:00
|
|
|
|
|
2021-09-13 17:25:24 +08:00
|
|
|
|
流程图需要使用drawio来打开,可以使用vscode drawio的插件来打开
|