1、介绍

在进行调试和维护时,常常需要与单片机进行交互,获取、设置某些参数或执行某些操作,nr_micro_shell正是为满足这一需求,针对资源较少的MCU编写的基本命令行工具。

虽然RT_Thread组件中已经提供了强大的finsh命令行交互工具,但对于ROM、RAM资源较少的单片机,finsh还是略显的庞大,在这些平台上,若仍想保留基本的命令行交互功能,nr_micro_shell是一个不错的选择。

项目地址github.com/Nrusher/nr_micro_shell

nr_micro_shell具有以下优点

1.占用资源少,使用简单,灵活方便。使用过程只涉及两个shell_init()和shell()两个函数,无论是使用RTOS还是裸机都可以方便的应用该工具,不需要额外的编码工作。

2.交互体验好。完全类似于linux shell命令行,当串口终端支持ANSI(如Hypertrm终端)时,其不仅支持基本的命令行交互,还提供Tab键命令补全,查询历史命令,方向键移动光标修改功能。

3.扩展性好。nr_micro_shell为用户提供自定义命令的标准函数原型,只需要按照命令编写命令函数,并注册命令函数,即可使用命令。

nr_micro_shell和相同配置下的finsh (finsh不使用msh)占用资源对比

原始工程 添加nr_micro_shell增加量 添加finsh增加量
ROM 63660 +3832 +26908
RAM 4696 +1104 +1304

两者配置都为

  • 最多3条历史命令。

  • 支持Tab补全 。

  • 命令行最大长度为100。

  • 最多10个命令参数。

  • 命令行线程堆栈为512字节。

nr_micro_shell演示效果如下

1.1 目录结构

名称 说明
docs 文档目录,包含演示的GIF图片等
examples 例子目录,包括命令函数示例:nr_micro_shell_commands.c 和RT_Thread下使用示例 nr_micro_shell_thread.c
inc 头文件目录
src 源代码目录

1.2 许可证

nr_micro_shell package 遵循 MIT 许可,详见 LICENSE 文件。

1.3 依赖

无依赖

2、RT_Thread 下 ENV 工具使用

RT_Thread 使用 nr_micro_shell package package 需要在 RT-Thread 的包管理器中选择它,具体路径如下:

RT-Thread online packagestools packages ---> [*] nr_micro_shell:Lightweight command line interaction tool. --->

相关的设置在按下sapce键选中后,按enter可进行相关参数配置。然后让 RT-Thread 的包管理器自动更新,或者使用 pkgs --update 命令更新包到 BSP 中。

若您需要运行示例,请保证RT_Thread配置中的Using console for kt_printf.选项是被打开的,kt_printf可以正常工作,且Use components automatically initialization.选项打开。编译直接下载或仿真便可以使用nr_micro_shell。命令行空白时按Tab,可显示所有支持的命令,测试示例命令可见doc/pic下的使用示例动图。自定义命令过程,参照下文3. 裸机下使用nr_micro_shell package中的方法。

3、裸机下使用

3.1 配置:

所有配置工作都可以在 nr_micro_shell_config.h 中完成。有关详细信息,请参见文件中的注释。

3.2 用法:

  • 确保所有文件都已添加到项目中。

  • 确保 nr_micro_shell_config.h 中的宏函数"shell_printf(),ansi_show_char()"可以在项目中正常使用。

  • 使用示例如下

#include "nr_micro_shell.h"int main(void)
{/* 初始化 */shell_init();while(1){if(USART GET A CHAR 'c'){/* nr_micro_shell接收字符 */shell(c);}}
}

建议直接使用硬件输入前,建议使用如下代码(确保可以正常打印信息),验证nr_micro_shell是否可以正常运行

#include "nr_micro_shell.h"int main(void)
{unsigned int i = 0;//匹配好结束符配置 NR_SHELL_END_OF_LINE 0char test_line[] = "test 1 2 3\n"/* 初始化 */shell_init();/* 初步测试代码 */for(i = 0; i < sizeof(test_line)-1; i++){shell(test_line[i]);}/* 正式工作代码 */while(1){if(USART GET A CHAR 'c'){/* nr_micro_shell接收字符 */shell(c);}}
}

3.3 添加自己的命令

STEP1:

您需要在nr_micro_shell_commands.c*中实现一个命令函数。命令函数的原型如下

void your_command_funtion(char argc, char *argv)
{.....
}

argc是参数的数目。argv存储每个参数的起始地址和内容。如果输入字符串是

test -a 1

argc为3,argv的内容为

-------------------------------------------------------------
0x03|0x08|0x0b|'t'|'e'|'s'|'t'|'\0'|'-'|'a'|'\0'|'1'|'\0'|
-------------------------------------------------------------

如果想知道第一个或第二个参数的内容,应该使用

/* "-a" */
printf(argv[argv[1]])
/* "1" */
printf(argv[argv[2]])

STEP2: 在使用命令前需要注册命令,共有两种方法注册命令

1.当配置文件中NR_SHELL_USING_EXPORT_CMD未被定义,在static_cmd[]表中写入

const static_cmd_st static_cmd[] =
{.....{"your_command_name",your_command_funtion},.....{"\0",NULL}
};

注意:不要删除{"\0",NULL}!

2.当配置文件中NR_SHELL_USING_EXPORT_CMD被定义,且NR_SHELL_CMD_EXPORT()支持使用的编译器时,可以使用以下方式注册命令

NR_SHELL_CMD_EXPORT(your_command_name,your_command_funtion);

4、linux下使用nr_micro_shell仿真

在工程./examples/simulator/目录下存放着nr_micro_shell仿真代码,仍在./examples/nr_micro_shell_commands.c文件中按上述方式添加自定义命令,添加完成后可以使用make命令编译源码,生产的可执行文件为./examples/simulator/out/nr_micro_shell./examples/simulator/out/nr_micro_shell_db。可使用的make命令如下

# 编译可执行文件
make
# 编译可仿真执行文件
make debug
# 清除编译生成文件
make clean

5、注意事项

根据你的使用习惯使用NR_SHELL_USING_EXPORT_CMD选择命令注册方式。

使用注册表注册命令时,确保您的工程中存在注册表

const static_cmd_st static_cmd[] =
{.....{"\0",NULL}
};

使用NR_SHELL_CMD_EXPORT()时确保,NR_SHELL_CMD_EXPORT()支持使用的编译器,否则会报错。

nr_micro_shell 不支持ESC键等控制键(控制符)。

项目地址:https://gitee.com/nrush/nr_micro_shell

轻量级单片机命令行交互项目,全部开源相关推荐

  1. 嗖一下【基于命令行交互的文件搜索工具】实现思路

    目录 一.背景 二.实现功能(todo) 三.效果展示 四.分析 存储文件位置分析 存储文件内容分析 打印文件信息分析 五.实现 六.使用 七.代码实现 八.总结 九.项目测试 一.背景 有时候需要在 ...

  2. django 命令行创建项目app

    django 命令行创建项目app 方法一: 在pycharm中打开Terminal 找到自己想要创建的文件目录下 创建app django-admin startapp app名称 方法二: 第一步 ...

  3. node命令行交互与child_process实战

    1. 前言   随着项目的逐步膨胀和复杂,我们在实际的工程应用中会通过编写各种各样的脚本来提高效率,传统的方法是在项目的package.json文件中注册各种各样的命令,来完成打包,构建,打包分析等操 ...

  4. 2-Qt6命令行控制台项目

    按如图新建流程后,得到基于qt的控制台项目,也就是命令行运行项目,显然它是无界面的.无界面的控制台项目,往往更加适合接口.测试等,因为Qt自己有封装也同时无缝支持c++,所以可支持两种方式,qt方式和 ...

  5. 使用 CliWrap 让C#中的命令行交互举重若轻

    在代码中进行命令行交互是一个很常见的场景, 特别是在一些CI CD 自动化流程中, 在这之前我们会使用 System.Diagnostics.Process API, 现在有一个更灵活的工具 CliW ...

  6. micropython webrepl_4-5 MicroPython WebREPL 命令行交互环境设置-2 接入点模式

    在这一节教程里我们将一起学习如何为NodeMCU在接入点模式下设置MicroPython网络命令行交互环境(以下简称: WebREPL). 所谓接入点模式就是NodeMCU可以建立WIFI网络供其他设 ...

  7. python自动化办公模块有哪些-python常见的命令行交互自动化模块有哪些

    用Python写的程序,保存为.py,添加什么命令才能使我一般都是在后面加一个输入语句. python可不可以采用非命令行方式 可以,预先写好代码 使用pythonw.exe执行py文件可以不打开黑框 ...

  8. 【Python】如何清空命令行交互界面的代码

    问题描述 清空命令行很简单,用cls命令即可.但在命令行交互界面写了很多 Python 代码,看着很不舒服,如何清空后从头开始写? 解决方案 os.system(command)使得在子 shell ...

  9. [APP] Android 开发笔记 001-环境搭建与命令行创建项目

    1. 安装JDK,SDK JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html Android SDK http ...

最新文章

  1. Xshell关闭导致jar服务终止,使Jar在CentOS后台运行
  2. 绝非玩笑!人工智能或开创黑客新时代
  3. word List28
  4. hdu 3746 kmp求循环节 下标从1开始
  5. HTTP/HTTPS 01-不同状态码含义
  6. ScrollView 收录
  7. python定时启动代码_python每天定时运行某程序代码
  8. Linux 基本网络配置
  9. 邮箱大师手机版服务器异常,邮箱大师安装步骤 邮箱大师常见问题
  10. unicode转gbk python_使用python实现GBK转unicode码查询表
  11. MySQL二进制日志文件格式
  12. 基于服务号的微信扫码关注公众号登录网站原理分析
  13. 计算机应届生面试,计算机应届生面试技巧
  14. Ceph Crush-Map与Ceph调优及其日常管理
  15. 基于jsp+ssm的旅游活动报名系统
  16. Python简单网页抽奖
  17. 数据挖掘中常用的数据清洗方法有哪些?
  18. 赛效:WPS如何给文档内容添加下划线
  19. 洛谷P5707 【深基2.例12】上学迟到(c语言)
  20. 案例:植物大战僵尸的基础界面

热门文章

  1. Shell在线工具--在线写shell
  2. python自动化运维笔记
  3. css3边框线border
  4. mobx系列(二)-mobx主要概念
  5. C#中的虚函数virtual
  6. 永久性排序sort与临时性排序sorted举例
  7. 八皇后问题理解与解决
  8. SpringCloud【面试题】
  9. CDISC的ADaMIG (V1.2) 中英文对照【2】_第二章 ADaM标准的基础
  10. 编写程序,输入一个3位整数,反转后输出。