在日常嵌入式开发中,我们经常会用串口命令来使设备进入某种特定的状态,或执行某个特定的操作。如系统自检,模拟运行,或者进入手动模式进行设备点动。linux下有强大的shell工具,可以让用户和片上系统进行交互,而在传统的单片机系统中,用户往往需要自行实现一套类似的交互工具。AliOS-Things原生带有一套名为cli(command-line interface)的命令行交互工具,在提供基本的系统交互命令的基础上,也支持用户自定义命令。本文将介绍如何自定义cli命令并执行。

我们通过在《【AliOS Things学习笔记】在Developerkit开发板上运行blink例程》基础上,注册一个cli命令,通过命令行的方式控制LED的亮灭的例子,来演示一个带有参数的cli命令如何被注册以及调用。

首先,我们先保证Developerkit的原有cli功能可用。将开发板通过USB连接线和PC连接。

windows用户通过设备管理器确认开发板所虚拟出的串口号,MAC和linux用户可用在终端中输入如下命令来查看USB串口是否已正确连接。

ls /dev/tty.*
复制代码

如果出现如下设备列表,则表示连接正确。usbmodem后的数字可能会因为计算机不同而不同。

/dev/tty.usbmodem14103
复制代码

此时,可用打开PC上的串口调试工具,设置对应的串口,波特率默认为115200bps。建议串口调试助手具备终端功能,这样会在cli的使用中有更好的体验。接下来我将以植入VScode中的aos-cube工具的串口监视器功能为例进行演示。打开VScode,确保已经按照alios-studio和aos-cube插件。点击alios-studio工具条中的“插头”按钮,启动串口monitor

如果工具没能正确地打开串口,也可以尝试在控制台中使用命令行的方式启动串口monitor。命令格式如下:

aos monitor /dev/tty.usbmodem14103 115200      #mac linux下命令
aos monitor com5 115200                        #windows 下命令
复制代码

成功进入串口monitor后,会从终端中打印出帮助信息。输入回车,会出现“#”提示符,此时就可以输入命令了。

--- Miniterm on /dev/tty.usbmodem14103  115200,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---#
#
复制代码

输入“help”回车,会看到当前支持的cli命令

# help
====Build-in Commands====
====Support 4 cmds once, seperate by ; ====
help      : print this
p         : print memory
m         : modify memory
echo      : echo for command
exit      : close CLI
devname   : print device name
sysver    : system version
reboot    : reboot system
time      : system time
ota       : system ota====User Commands====
loglevel  : set log level
tasklist  : list all thread info
dumpsys   : dump system info
udp       : [ip] [port] [string data] send udp data
wifi_debug: wifi debug mode
mac       : get/set mac
kv        : kv [set key value | get key | del key | list]
version   : show version#
复制代码

输入“tasklist”,可以看到现有的任务运行情况

# tasklist
------------------------------------------------------------------------
cpu usage period = 25
CPU usage :   1.89
------------------------------------------------------------------------
Name               State    Prio StackSize MinFreesize Runtime %CPU Candidate
------------------------------------------------------------------------
dyn_mem_proc_task  PEND     6    256       216         22         0.00   N
idle_task          RDY      61   200       177         745102697 98.11   N
DEFAULT-WORKQUEUE  PEND     20   768       738         23         0.00   N
timer_task         PEND     5    300       254         25         0.00   N
aos-init           PEND     32   1536      1389        1419569    1.38   N
cli                RDY      60   512       271         491760     0.47   Y
------------------------------------------------------------------------
复制代码

到此,我们已经验证了cli功能在Developerkit开发板上,接下我们开始注册和使用自己的cli命令。

我们依然打开blink.c文件,在其中添加代码实现。首先,cli命令的注册,依赖于一个名为cli_command结构体,结构体描述如下:

struct cli_command {const char *name;            // 命令体,字符串const char *help;            // 命令的帮助说明文本,字符串void (*function)(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv);// 命令被执行时实际调用的功能函数
};
复制代码

在本例中,我们将cli命令命名为“led_switch”,帮助文本字符串为“[on] turn on led2;[off] trun off led2”

接下来我们来实现cli命令的功能函数。将下面函数直接加入blink.c文件中。

static void led_switch(char *pwbuf, int blen, int argc, char **argv)
{if(argc == 1)                       // 如果参数为空,则报错返回{LOG("参数错误");return;}if(strcmp(argv[1],"on") == 0)       // 如果输入参数为“on”,则点亮led{hal_gpio_output_low(&led);      // GPIO输出低,点亮LED2}else{hal_gpio_output_high(&led);     // GPIO输出高,熄灭LED2}
}
复制代码

cli函数具有固定的形式和参数,参考上述函数实现,用户只需要修改函数名,请保持参数与上述函数一致,参数的意义如下:

参数名称参数描述char *pwbuf当函数执行完成返回时,通过控制台打印出来的字符串指针。可以不传入。int blen上述字符串长度int argc命令调用时传入的参数长度,没有参数传入时为1char **argv传入参数缓存,字符串。第一个有效参数的角标从1开始。

接下来填写注册用结构体,以便将命令信息传递给cli服务。按照前所讲的设计,注册结构体信息如下,将结构体拷贝到blink.c文件中。

struct cli_command led_switch_command[] = {{.name = "led_switch",            // 命令名称.help = "[on] turn on led2;[off] trun off led2",// 帮助文本.function = led_switch           // 命令具体执行的函数指针}
};
复制代码

将cli命令注册到系统中。cli命令注册只需要一个函数如下:

aos_cli_register_commands(&led_switch_command[0],1);
复制代码

函数需要传入两个参数,参数1为刚刚创建的命令信息体的结构体指针;参数2,为本次需要注册的命令数,也就是说可以一次性注册多个命令,只需要在命令信息结构体中,用数组的方式同时填入几个命令的信息即可。

将上述函数调用加入到blink.c文件application_start函数的如下位置:

aos_cli_register_commands(&led_switch_command[0],1); // 注册cli命令函数aos_loop_run();
复制代码

至此,一个cli命令的实现和注册的代码编写部分就完成了。编译并下载至开发板中运行。在cli控制台输入help,看到led_switch命令已注册成功。

# help
====Build-in Commands====
====Support 4 cmds once, seperate by ; ====
help      : print this
p         : print memory
m         : modify memory
echo      : echo for command
exit      : close CLI
devname   : print device name
sysver    : system version
reboot    : reboot system
time      : system time
ota       : system ota====User Commands====
loglevel  : set log level
tasklist  : list all thread info
dumpsys   : dump system info
udp       : [ip] [port] [string data] send udp data
wifi_debug: wifi debug mode
mac       : get/set mac
kv        : kv [set key value | get key | del key | list]
version   : show version
led_switch: [on] turn on led2;[off] trun off led2
复制代码

测试命令是否执行,在命令提示符下输入如下命令,并回车:

#led_switch on
复制代码

led2点亮

测试参数有效性判断,输入如下指令,不带参数。命令按设计返回错误报警。

## led_switch
[1291080]<V> 参数错误
复制代码

赶快试试,加入自己的cli功能吧!

原文链接

本文为云栖社区原创内容,未经允许不得转载。

转载于:https://juejin.im/post/5bf64eeae51d45491b014039

为你的AliOS Things应用增加自定义cli命令相关推荐

  1. 在EmberZNet中创建自定义CLI命令

    在Zigbee项目中,您可以找到许多可用于调试的预构建CLI命令.对于每个工程师来说,开发产品都很方便.如果在控制台上键入" help",则可以找到以下CLI命令,包括但不限于: ...

  2. Hive-CDH参数修改指南--增加自定义参数--命令行显示当前数据-查询结果显示表头(类似修改源生Hive的hive-site.xml文件)

    Hive-CDH参数修改指南(类似修改源生Hive的hive-site.xml文件) 问题描述 默认配置下,每次启动Hive都要手动输入配置选项,才能实现:在命令行显示当前数据库(set hive.c ...

  3. wordpress给后台文章列表增加自定义排序栏

    为什么80%的码农都做不了架构师?>>>    受到Joost de Valk文章custom post type snippets 的启发,Joost的这篇文章简单地提供了一段怎么 ...

  4. 给Fedora 15的gnome3增加自定义程序快捷方式

    2019独角兽企业重金招聘Python工程师标准>>> 用了一段时间的Fedora 15 + gnom3之后发现一个很蛋疼的地方:程序列表里面列出的程序都是那些用过yum安装的程序, ...

  5. gnome3增加自定义程序快捷方式

    <gnome3增加自定义程序快捷方式> https://blog.csdn.net/weixin_34400525/article/details/91842932 转自weixin_34 ...

  6. linux添加自己的库,Linux学习笔记——例叙makefile 增加自定义共享库

    Linux学习笔记--例说makefile 增加自定义共享库 0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己 ...

  7. 【实用】表维护视图SM30增加自定义按钮的实现

    表维护视图SM30增加自定义按钮的实现 1.新建Table并通过"表维护生成器"生成SM30维护视图. 正常的创建表维护视图到这一步也就结束了,最多是进函数组调整字段名称和显示效果 ...

  8. SD--如何在输出控制中增加自定义字段

    在sap的输出控制中,我们有时需要增加系统未定义的字段作为条件表的字段,为了实现该需求我们就需要修改增强. 输出控制用到的通讯结构 KOMKBK1 (Output Determination Comm ...

  9. PowerBI随笔(3)-增加自定义列

    商品表加上价格 然后增加自定义列,统计金额 (1)合并查询,加上价格 (2)增加自定义列

最新文章

  1. Kernel i2c gpio spi pinctrl platform 分析讲解 (未完待续)
  2. Java中如何生成jar(框架)
  3. git github的使用
  4. java数组的实现_Java数组HashCode实现
  5. LeetCode(171)——Excel表列序号(JavaScript)
  6. java中的锁池和等待池
  7. LINUX SHELL命令ls只列出目录名
  8. 刷新代码IOS 上拉分页刷新--
  9. 计算机科学导论教学大纲,lbrack;机器人学导论rsqb;课程教学大纲
  10. 使用 OpenSSL 创建ssl自签名证书
  11. 程序员如何庆祝十一:用Python绘制红色的中国地图
  12. axure8屏幕滚动_Axure8原型教程:实现滚动效果(小技巧:隐藏滚动条)
  13. 大数手算法开平方(Java实现)
  14. 【数据库原理及应用】——数据库设计(学习笔记)
  15. HTML+CSS实现背景图片铺满页面的方法
  16. C/C++公交路线自动化选择系统
  17. 阿里云-RPA-2-第一个PRA程序
  18. PLY文档翻译——利用Python进行词法和语法分析
  19. 屏蔽无法验证发行者,你确实要运行此软件吗?的提示
  20. 远程访问操作mysql数据库

热门文章

  1. Python3 注释
  2. mysql中查询触发器的语句
  3. 乐视手机android流量,乐视手机流量不能用怎么办
  4. 12.2.12 创建有响应的用户界面 捕获异常
  5. 为什么要进行透明计算和透明计算是什么
  6. element 修改分页样式_如何给wordpress网站的文章列表,添加分页效果?可以通过2种方式...
  7. Hibernate的拦截器和监听器 .
  8. 如何使用java synchronized进行线程同步 .
  9. ant基本标签 及import properties
  10. spring 配置jdbc/hibernate/jpa