摘要: 怎么才能在RTOS系统中,通过 串口shell控制LED的开关。

在日常嵌入式开发中,我们经常会用串口命令来使设备进入某种特定的状态,或执行某个特定的操作。如系统自检,模拟运行,或者进入手动模式进行设备点动。linux下有强大的shell工具,可以让用户和片上系统进行交互,而在传统的单片机系统中,用户往往需要自行实现一套类似的交互工具。AliOS-Things原生带有一套名为cli(command-line interface)的命令行交互工具,在提供基本的系统交互命令的基础上,也支持用户自定义命令。本文将介绍如何自定义cli命令并执行。
我们通过在《【AliOS Things学习笔记】在Developerkit开发板上运行blink例程》基础上,注册一个cli命令,通过命令行的方式控制LED的亮灭的例子,来演示一个带有参数的cli命令如何被注册以及调用。
首先,我们先保证Developerkit的原有cli功能可用。将开发板通过USB连接线和PC连接。

 
windows用户通过设备管理器确认开发板所虚拟出的串口号,MAC和linux用户可用在终端中输入如下命令来查看USB串口是否已正确连接。
  1. ls /dev/tty.*
如果出现如下设备列表,则表示连接正确。usbmodem后的数字可能会因为计算机不同而不同。
  1. /dev/tty.usbmodem14103
此时,可用打开PC上的串口调试工具,设置对应的串口,波特率默认为115200bps。建议串口调试助手具备终端功能,这样会在cli的使用中有更好的体验。接下来我将以植入VScode中的aos-cube工具的串口监视器功能为例进行演示。打开VScode,确保已经按照alios-studio和aos-cube插件。点击alios-studio工具条中的“插头”按钮,启动串口monitor
如果工具没能正确地打开串口,也可以尝试在控制台中使用命令行的方式启动串口monitor。命令格式如下:
  1. aos monitor /dev/tty.usbmodem14103 115200 #mac linux下命令
  2. aos monitor com5 115200 #windows 下命令
成功进入串口monitor后,会从终端中打印出帮助信息。输入回车,会出现“#”提示符,此时就可以输入命令了。
  1. --- Miniterm on /dev/tty.usbmodem14103 115200,8,N,1 ---
  2. --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
  3. #
  4. #
输入“help”回车,会看到当前支持的cli命令
  1. # help
  2. ====Build-in Commands====
  3. ====Support 4 cmds once, seperate by ; ====
  4. help : print this
  5. p : print memory
  6. m : modify memory
  7. echo : echo for command
  8. exit : close CLI
  9. devname : print device name
  10. sysver : system version
  11. reboot : reboot system
  12. time : system time
  13. ota : system ota
  14. ====User Commands====
  15. loglevel : set log level
  16. tasklist : list all thread info
  17. dumpsys : dump system info
  18. udp : [ip] [port] [string data] send udp data
  19. wifi_debug: wifi debug mode
  20. mac : get/set mac
  21. kv : kv [set key value | get key | del key | list]
  22. version : show version
  23. #
输入“tasklist”,可以看到现有的任务运行情况
  1. # tasklist
  2. ------------------------------------------------------------------------
  3. cpu usage period = 25
  4. CPU usage : 1.89
  5. ------------------------------------------------------------------------
  6. Name State Prio StackSize MinFreesize Runtime %CPU Candidate
  7. ------------------------------------------------------------------------
  8. dyn_mem_proc_task PEND 6 256 216 22 0.00 N
  9. idle_task RDY 61 200 177 745102697 98.11 N
  10. DEFAULT-WORKQUEUE PEND 20 768 738 23 0.00 N
  11. timer_task PEND 5 300 254 25 0.00 N
  12. aos-init PEND 32 1536 1389 1419569 1.38 N
  13. cli RDY 60 512 271 491760 0.47 Y
  14. ------------------------------------------------------------------------
到此,我们已经验证了cli功能在Developerkit开发板上,接下我们开始注册和使用自己的cli命令。
我们依然打开blink.c文件,在其中添加代码实现。首先,cli命令的注册,依赖于一个名为cli_command结构体,结构体描述如下:
  1. struct cli_command {
  2. const char *name; // 命令体,字符串
  3. const char *help; // 命令的帮助说明文本,字符串
  4. void (*function)(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv);
  5. // 命令被执行时实际调用的功能函数
  6. };
在本例中,我们将cli命令命名为“led_switch”,帮助文本字符串为“[on] turn on led2;[off] trun off led2”
接下来我们来实现cli命令的功能函数。将下面函数直接加入blink.c文件中。
  1. static void led_switch(char *pwbuf, int blen, int argc, char **argv)
  2. {
  3. if(argc == 1) // 如果参数为空,则报错返回
  4. {
  5. LOG("参数错误");
  6. return;
  7. }
  8. if(strcmp(argv[1],"on") == 0) // 如果输入参数为“on”,则点亮led
  9. {
  10. hal_gpio_output_low(&led); // GPIO输出低,点亮LED2
  11. }
  12. else
  13. {
  14. hal_gpio_output_high(&led); // GPIO输出高,熄灭LED2
  15. }
  16. }
cli函数具有固定的形式和参数,参考上述函数实现,用户只需要修改函数名,请保持参数与上述函数一致,参数的意义如下:
参数名称
参数描述
char *pwbuf
当函数执行完成返回时,通过控制台打印出来的字符串指针。可以不传入。
int blen
上述字符串长度
int argc
命令调用时传入的参数长度,没有参数传入时为1
char **argv
传入参数缓存,字符串。第一个有效参数的角标从1开始。
接下来填写注册用结构体,以便将命令信息传递给cli服务。按照前所讲的设计,注册结构体信息如下,将结构体拷贝到blink.c文件中。
  1. struct cli_command led_switch_command[] = {
  2. {
  3. .name = "led_switch", // 命令名称
  4. .help = "[on] turn on led2;[off] trun off led2",// 帮助文本
  5. .function = led_switch // 命令具体执行的函数指针
  6. }
  7. };
将cli命令注册到系统中。cli命令注册只需要一个函数如下:
  1. aos_cli_register_commands(&led_switch_command[0],1);
函数需要传入两个参数,参数1为刚刚创建的命令信息体的结构体指针;参数2,为本次需要注册的命令数,也就是说可以一次性注册多个命令,只需要在命令信息结构体中,用数组的方式同时填入几个命令的信息即可。
将上述函数调用加入到blink.c文件application_start函数的如下位置:
  1. aos_cli_register_commands(&led_switch_command[0],1); // 注册cli命令函数
  2. aos_loop_run();
至此,一个cli命令的实现和注册的代码编写部分就完成了。编译并下载至开发板中运行。在cli控制台输入help,看到led_switch命令已注册成功。
  1. # help
  2. ====Build-in Commands====
  3. ====Support 4 cmds once, seperate by ; ====
  4. help : print this
  5. p : print memory
  6. m : modify memory
  7. echo : echo for command
  8. exit : close CLI
  9. devname : print device name
  10. sysver : system version
  11. reboot : reboot system
  12. time : system time
  13. ota : system ota
  14. ====User Commands====
  15. loglevel : set log level
  16. tasklist : list all thread info
  17. dumpsys : dump system info
  18. udp : [ip] [port] [string data] send udp data
  19. wifi_debug: wifi debug mode
  20. mac : get/set mac
  21. kv : kv [set key value | get key | del key | list]
  22. version : show version
  23. led_switch: [on] turn on led2;[off] trun off led2
测试命令是否执行,在命令提示符下输入如下命令,并回车:
  1. #led_switch on
led2点亮
测试参数有效性判断,输入如下指令,不带参数。命令按设计返回错误报警。
  1. ## led_switch
  2. [1291080]<V> 参数错误
赶快试试,加入自己的cli功能吧!
 
 
阅读原文​​​​​​​

为你的AliOS Things应用增加自定义cli命令的更多相关文章

  1. 修改node来增加自定义工具命令

    如何通过node创建自定义cmd命令 一.命令功能的实现 1.将自己的自定义工具的文件夹放到当前使用的 node 的安装目录下的 node_modules 文件夹下面: 2.回到node安装目录下复制 ...

  2. [转]通过继承ConfigurationSection,在web.config中增加自定义配置

    本文转自:http://www.blue1000.com/bkhtml/2008-02/55810.htm 前几天写了一篇使用IConfigurationSectionHandler在web.conf ...

  3. 在WPS绿色版中增加自定义皮肤

    在WPS绿色版中增加自定义皮肤小俊的博客:http://xiaojun911.com/WPS绿色版:http://xiaojun911.com/xiazai/469.html小俊精简的WPS2016 ...

  4. dedecms如何增加自定义字段

    开源的cms比较好的一点是可以根据自己的需求来开发相应的功能,比如dedecms想要增加一个专家职称字段调用要怎么调用呢? 增加自定义字段:后台找到 “核心” - 频道模型 - 内容模型管理 - 字段 ...

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

    gnome3增加自定义程序快捷方式   1. 安装alacarte   在命令行输入下列命令安装alacarte程序   yum -y install alacarte   安装完毕后,在命令行输入下 ...

  6. 在项目中增加自定义icon图标

    以MUI框架为例,内容来自于MUI官网. mui如何增加自定义icon图标 mui框架遵循极简原则,在icon图标集上也是如此,mui仅集成了原生系统中最常用的图标:其次,mui中的图标并不是图片,而 ...

  7. Odoo8在TreeView左上角增加自定义按钮以及通过继承生成自定义的View_Mode

    今天有网友在问怎么在TreeView左上角增加一个自定义的按钮,在查询Odoo 自带的模块,发现在purchase_requisition中有使用,并且此模块还应用到了自定义View_Mode的情况, ...

  8. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.2——增加自定义task

    问题: 你想要在整体的构建过程中加入自定义的task. 解决方案: 使用dependOn属性将你的任务插入 directed acyclic graph 讨论: 在初始化阶段,Gradle将任务根据依 ...

  9. [ubuntu][deepin]系统增加自定义开机启动项

    [ubuntu][deepin]系统增加自定义开机启动项 进行配置 cd /etc/init.d/ ls vim myScript nginx实例 #! /bin/sh # chkconfig: # ...

随机推荐

  1. 关于BSP,BIOS,和bootloader

    BSP是板级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板.BSP是相对于操作系统而言的,不同的操作系统对应于不同定 ...

  2. Type Interceptors

    Type Interceptors Castle.Core, part of the Castle Project, provides a method interception framework ...

  3. ArrayList 源码解读

    ArrayList 源码解读     基于JDk 1.7.0_80 public class ArrayList<E> extends AbstractList<E> impl ...

  4. Git是目前世界上最先进的分布式版本控制系统(没有之一)。

    http://zhidao.baidu.com/link?url=NSYPiSvtGTMoqMA9vt68FRRF8WbfYVmwWeMh47_2lkp0K3jFMl--1Co1tg1R4VshTQV ...

  5. spring容器、spring MVC容器以及web容器的区别

    本文转载自 https://www.cnblogs.com/xiexin2015/p/9023239.html 说到spring和springmvc,其实有很多工作好多年的人也分不清他们有什么区别,如 ...

  6. JSP基础--会话跟踪技术、cookie、session

    会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...

  7. CSS基础--属性选择器、伪类选择器

    属性选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  8. 利用Lua实现二叉查找树并进行各种遍历

    -- author : coder_zhang-- date : 2014-6-25 root = nil function insert_node(number) if root == nil th ...

  9. 消息中间件-技术专区-RocketMQ架构原理

    RocketMQ是阿里开源的分布式消息中间件,跟其它中间件相比,RocketMQ的特点是纯JAVA实现:集群和HA实现相对简单:在发生宕机和其它故障时消息丢失率更低. 一.RocketMQ专业术语 P ...

  10. pytest--命令行参数

    使用pytest --help可以查看全部选项 ​ -v:pytest -v 说明:可以输出用例更加详细的执行信息,比如用例所在的文件及用例名称等 -q(--quiet) 该选项的作用与-v/--ve ...