作者 | nrush
命令行交互在上位机软件比较常见,在单片机中实现命令交互也有很多案例,这里分享一个开源的命令行工具:nr_micro_shell.
1、介绍
在进行调试和维护时,常常需要与单片机进行交互,获取、设置某些参数或执行某些操作,nr_micro_shell正是为满足这一需求,针对资源较少的mcu编写的基本命令行工具。
虽然rt_thread组件中已经提供了强大的finsh命令行交互工具,但对于rom、ram资源较少的单片机,finsh还是略显的庞大,在这些平台上,若仍想保留基本的命令行交互功能,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 packages tools 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.hint main(void){ /* 初始化 */ shell_init(); while(1) { if(usart get a char 'c') { /* nr_micro_shell接收字符 */ shell(c); } }} 建议直接使用硬件输入前,建议使用如下代码(确保可以正常打印信息),验证nr_micro_shell是否可以正常运行
#include nr_micro_shell.hint main(void){ unsigned int i = 0; //匹配好结束符配置 nr_shell_end_of_line 0 char test_line[] = test 1 2 3 /* 初始化 */ 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'|''|'-'|'a'|''|'1'|''|------------------------------------------------------------- 如果想知道第一个或第二个参数的内容,应该使用
/* -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}, ..... {,null}}; 注意:不要删除{,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[] ={ ..... {,null}}; 使用nr_shell_cmd_export()时确保,nr_shell_cmd_export()支持使用的编译器,否则会报错。
nr_micro_shell 不支持esc键等控制键(控制符)。
Segway路萌机器人新酷潮品极速开箱,真机上手一验便知
搭载联发科x20处理器的手机有哪些_联发科Helio X20与高通骁龙650处理器哪个更好
110家高校企业代表齐聚汇川,共筑万企千校人才生态
智能手机怎样正确消毒
福日电视万能遥控器代码
如何在单片机中实现命令交互
新能源汽车爆发式增长,让锂镍不够用了?
关于物联网rfid技术在工业自动化中的应用
EDA三巨头中国业务不降反升的原因
一文解析射频天线指标和5G NR的帧结构
如何在相控阵设计中应用优化技术
屏下指纹识别技术突破,带动2018年指纹识别渗透率达60%
高压差分探头的高频耐电压曲线及维护
新能源汽车行业前景良好之下,充电桩行业为什么要开始洗牌?
工业机器人在工业生产中有哪些优势呢
崧盛股份离正式亮相创业板资本市场,只一步之遥
简单的VB串口发送程序示例
永磁电机的结构与原理
手机充电器的维修原理解析
智能语音电话机器人的作用是什么