文章目录

  • 1 命令解释器的设计及实现

1 命令解释器的设计及实现

命令解释器的实现较为简单,流程简单归纳为:

  • 打印命令提示符
  • 读取一行字符串
  • 解析命令,执行操作,必要时打印结果

主要实现了如下命令:

实现代码如下:
cli.h:

/*** @brief 命令解释器设计* @details* @author 01课堂 李述铜 http://01ketang.cc* @date 2017-06-01* @version 1.0* @copyright 版权所有,禁止用于商业用途*/
#ifndef CLI_H
#define CLI_H#define CLI_TASK_PRIO                     0
#define CLI_CMD_PROMATE_SIZE            64
#define CLI_TASK_ENV_SIZE               512
#define CLI_CMD_HISTORY_SIZE            1024
#define CLI_CMD_BUFFER_SIZE             128void CLIInit (void);#endif //CLI_H

cli.c:

/*** @brief 命令解释器设计* @details* @author 01课堂 李述铜 http://01ketang.cc* @date 2017-06-01* @version 1.0* @copyright 版权所有,禁止用于商业用途*/
#include <string.h>
#include "tinyOS.h"
#include "cli.h"
#include "uart.h"
#include "extio.h"
#include "WaveGen.h"#define TERMINAL_BS     0x08
#define TERMINAL_SPACE  ' '
#define TERMINAL_CR     '\r'
#define TERMINAL_LF     '\n'
#define TERMINAL_TAB    '\t'// 空白字符
static const char spaceCh[] = {TERMINAL_SPACE, TERMINAL_CR, TERMINAL_LF, TERMINAL_TAB, '\0'};
static const char * unknownPinMsg = "Unknown Pin\r\n";
static const char * unknownCmdMsg = "Unknown Command!\r\n";
static const char * noEnoughParamMsg = "No Enough Param!\r\n";// 任务相关
static tTaskStack cliTaskEnv[CLI_TASK_ENV_SIZE];     // 任务1的堆栈空间
static tTask cliTask;// 命令行提示缓冲区
static char promoteBuffer[CLI_CMD_PROMATE_SIZE];/*** 显示消息*/
static void showMsg (const char * msg) {UartWrite(msg, strlen(msg));
}/*** 输出显示字符* @param ch*/
static void showCh (const char ch) {UartWrite(&ch, 1);
}/*** 显示提示符*/
static void showPromote (void) {UartWrite(promoteBuffer, strlen(promoteBuffer));
}/*** 更改提示符*/
static void setPromote (const char * newPromote) {strncpy(promoteBuffer, newPromote, sizeof(promoteBuffer));promoteBuffer[sizeof(promoteBuffer) - 1] = '\0';
}/*** 提示符修改命令*/
static void promoteCmd (void) {char * promote = strtok(NULL, spaceCh);if (promote == NULL) {showMsg(noEnoughParamMsg);return;}setPromote(promote);
}/*** 将引脚名转换为内部序号* @param pinCh* @return*/
static ExtIOPin convertPinNum (char * pinCh) {ExtIOPin pinNum;if (pinCh == NULL) {return ExtIOPinEnd;}pinNum = (ExtIOPin)(*pinCh - '0');if (pinNum >= ExtIOPinEnd) {return ExtIOPinEnd;}return pinNum;
}/*** 外部IO命令解析*/
static void extioCmd () {char * type = strtok(NULL, spaceCh);if (type == NULL) {showMsg(noEnoughParamMsg);return;}if (strstr(type, "get")) {      // 命令extio get pinExtIOPin pin;ExtIOState state;pin = convertPinNum(strtok(NULL, spaceCh));if (pin == ExtIOPinEnd) {showMsg(unknownPinMsg);return;}state = ExtIOGetState(pin);showMsg((state == ExtIOHigh) ? "1\r\n" : "0\r\n");} else if (strstr(type, "set")) {   // 命令extio set pin valueExtIOPin pin;char * value;pin = convertPinNum(strtok(NULL, spaceCh));if (pin == ExtIOPinEnd) {showMsg(unknownPinMsg);return;}value = strtok(NULL, spaceCh);if (value == NULL) {showMsg(noEnoughParamMsg);return;}ExtIOSetState(pin, *value == '0' ? ExtIOLow : ExtIOHigh);} else if (strstr(type, "dir")) {   // 命令extio dir pin in/outExtIOPin pin;char *outType;pin = convertPinNum(strtok(NULL, spaceCh));if (pin == ExtIOPinEnd) {showMsg(unknownPinMsg);return;}outType = strtok(NULL, spaceCh);if (outType == NULL) {showMsg(noEnoughParamMsg);return;}ExtIOSetDir(pin, strstr(outType, "in") ? 1 : 0);} else {showMsg(noEnoughParamMsg);}
}/*** 波形输出命令解析*/
static void waveCmd () {char *type = strtok(NULL, spaceCh);if (type == NULL) {showMsg(noEnoughParamMsg);return;}if (strstr(type, "square")) {      // 命令wave squareWaveSelectType(WaveSquare);} else if (strstr(type, "start")) {WaveStartOutput();} else if (strstr(type, "stop")) {WaveStopOutput();} else {showMsg(noEnoughParamMsg);}
}/*** 未知命令处理*/
static void unknowCmd (void) {showMsg(unknownCmdMsg);
}/*** 读取一行数据,如果命令超过则截断*/
static void readLine (char * buffer, uint32_t maxLen) {uint32_t index = 0;while (index < maxLen) {char ch;UartRead(&ch, 1);switch (ch) {case TERMINAL_BS:   // 退格键if (index > 0) {buffer[index--] = '\0';showCh(TERMINAL_BS);showCh(TERMINAL_SPACE);showCh(TERMINAL_BS);}break;case TERMINAL_CR:showCh(TERMINAL_LF);default:showCh(ch);buffer[index++] = ch;if ((ch == '\n') || (ch == '\r') || (index >= maxLen)) {buffer[index] = '\0';return;}break;}}
}/*** 解析命令*/
static void processCmd (char * cmdLine) {char * cmdStart;// 获取开头cmdStart = strtok(cmdLine, spaceCh);if (cmdStart == NULL) {return;}// 识别命令if (strstr(cmdStart, "extio")) {extioCmd();} else if (strstr(cmdStart, "wave")) {waveCmd();} else if (strstr(cmdStart, "promote")){promoteCmd();} else {unknowCmd();}
}/*** 解释器任务* @param param*/
void cliTaskEntry (void * param) {static char cmdBuffer[CLI_CMD_BUFFER_SIZE];for (;;) {showPromote();readLine(cmdBuffer, sizeof(cmdBuffer));processCmd(cmdBuffer);}
}/*** 命令解释器设计*/
void CLIInit (void) {strcpy(promoteBuffer, ">>");tTaskInit(&cliTask, cliTaskEntry, (void *) 0x0, CLI_TASK_PRIO, cliTaskEnv, sizeof(cliTaskEnv));
}

参考资料:

  1. 手把手教你学用嵌入式操作系统

命令解释器的设计及实现相关推荐

  1. C语言 scpi命令解释器,基于Python的SCPI命令解释器的设计

    基于Python的SCPI命令解释器的设计 目前可编程仪器标准命令(SCPI)依然被广泛使用,因此设计一个高效通用的SCPI命令解释器很重要.常用的SCPI命令解释器多以C语言开发,采用链式二叉树等存 ...

  2. 操作系统课设之简单 shell 命令行解释器的设计与实现

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  3. 操作系统课程设计--在Linux环境下模拟实现简单命令解释器(C++代码)

    操作系统课程设计要求 一.设计目的 熟悉Linux编程环境,加强对Linux命令的理解及函数的运用 二.设计内容 1. 在Linux环境下模拟实现简单命令解释器. (1)要求实现的基本命令包括: pw ...

  4. linux简单命令解释器设计,Linux环境下模拟实现命令解释器

    在Linux环境下模拟实现命令解释器 一.程序概述 1.进入系统概述 本次课程设计是在红帽Linux发行版(Red Hat Enterprise Linux AS release 4 (Nahant ...

  5. C语言 scpi命令解释器,SCPI命令解释器设计

    摘要: 随着计算机技术的迅猛发展,受其影响的仪器行业也发生了巨大的变革,即仪器使用的手动操作改为计算机控制的自动测试.世界著名仪器厂家共同研究制定了用于可程控仪器的标准命令SCPI(Standard ...

  6. 操作系统课程设计---实验十 简单shell命令行解释器的设计与实现

    实验十 简单shell命令行解释器的设计与实现 完整课程设计源码及其报告查看:陈陈的操作系统课程设计 1.实验目的 本实验主要目的在于进一步学会如何在 Linux 系统下使用进程相关的系统调用,了解 ...

  7. 操作系统-VM-linux命令解释器

    一. 程序概述 完成的任务 1.mypwd列出当前目录的名称. 2.mychdir改变当前目录. 3.mymkdir新建一个目录 4.myrmdir删除文件夹 5.exit退出命令解释器. 6.myr ...

  8. C语言 scpi命令解释器,SCPI命令解释器的实现.pdf

    SCPI命令解释器的实现.pdf 第 10卷 第 3期 信 息 与 电 子 工 程 VO1.10,NO.3 2012年 6月 INFORMATION AND ELECTRONIC ENGINEERIN ...

  9. C语言 scpi命令解释器,SCPI命令解释器的实现

    摘要: 可程控仪器命令标准(SCPI)目前被广泛应用于测试测量仪器的操作控制中.针对数字示波器的SCPI命令集,研究并设计了一种SCPI命令解释器,此命令解释器通过采用二叉树结构来存储数字示波器的SC ...

最新文章

  1. 腾讯----贪吃的小Q
  2. 积极打破消极思维模式
  3. RO38 –比较RemObjects SDK 通道
  4. Spring 事务使用详解
  5. JUnit5基本用法
  6. angular4点击事件监听_angular 事件广播和事件监听
  7. Chap 06 HTML使用表格
  8. python之web编程
  9. LoadRunner11下载以及详细破解说明
  10. 【项目一、xxx病虫害检测项目】2、网络结构尝试改进:Resnet50、SE、CBAM、Feature Fusion
  11. 微信小程序发送验证码短信SDK及文档
  12. php 递归函数返回数组,php递归函数 PHP中Array相关函数简介
  13. 智和网管平台-真正开放源码的网元管理系统(EMS)
  14. CSS制作的32种图形效果 梯形 | 三角 | 椭圆 | 平行四边形 | 菱形 | 四分之一圆 | 旗帜
  15. PC微信3.3.0内测版(新增朋友圈功能)
  16. 433_ev1527发送端驱动
  17. WeUI:专为开发微信HTML5应用的开源Web UI组件库
  18. FCM推送 push
  19. 中国电信物联网发展研究中心与华为战略合作协议
  20. 戴森史上最轻吸尘器全球首发,搭配吸头后仅重1.5千克

热门文章

  1. html任务清单源码,JavaScript jQuery 任务清单 ToDoList
  2. Java相对路径调用dll文件,VS项目中调用他人提供的.lib和.dll文件的用法(绝对路径和相对路径)...
  3. 4.3 核对矩阵的维数-深度学习-Stanford吴恩达教授
  4. 一起学nRF51xx 22 -  实现一个具体SVC调用功能的demo
  5. 图像配准代码(包含matlab/opencv C++)
  6. 2、C语言面试笔试---运算符和表达式
  7. 雅客EXCEL(6)-通用表格格式、销售实际案例(总结之前的知识点)
  8. 【Ansible】的python api
  9. 我的第一个Scrapy 程序 - 爬取当当网信息
  10. Unity UGUI —— 无限循环List(转载)