STM32中实现shell控制台(命令解析实现)

文章目录

    • 一、核心设计思想
    • 二、命令系统实现详解(含完整注释)
      • 1. 示例命令函数实现
      • 2. 初始化命令系统
      • 3. 命令注册函数
      • 4. 命令查找函数
      • 5. 命令执行函数
    • 三、命令结构体(cmd\_t)
    • 四、运行效果示例
    • 五、小结

在嵌入式系统的命令行控制台(Shell)中,命令解析模块扮演着关键角色。它负责:

  1. 接收字符串命令;
  2. 拆分命令参数;
  3. 查找匹配的命令函数;
  4. 调用命令对应的处理函数。

本文基于 cmd.c 实现讲解一个简单而高效的命令注册与执行框架。


一、核心设计思想

命令系统基于以下数据结构和接口实现:

  • 命令表(cmd_table):保存所有注册命令;
  • 命令函数指针(cmd_func_t):指向具体执行逻辑;
  • cmd_execute():接收命令字符串,拆分参数并调用对应命令函数;
  • cmd_register():注册命令;
  • cmd_find():通过命令名查找。

二、命令系统实现详解(含完整注释)

#include "cmd.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>#define CMD_TABLE_MAX 32  // 最多支持 32 个命令// 命令表:用于保存所有注册的命令
static cmd_t cmd_table[CMD_TABLE_MAX];
static int cmd_count = 0; // 当前注册命令数

1. 示例命令函数实现

// help 命令:打印帮助信息
int cmd_help(int argc, char *argv[])
{printf("help: Show this message\r\n");// 可扩展:遍历 cmd_table 打印所有命令和说明return 0;
}// echo 命令:回显输入参数
int cmd_echo(int argc, char *argv[])
{for (int i = 1; i < argc; i++){printf("%s ", argv[i]);}printf("\r\n");return 0;
}

2. 初始化命令系统

// 初始化命令系统:注册内置命令
void cmd_init(void)
{cmd_register("help", cmd_help, "Show help");cmd_register("echo", cmd_echo, "Echo args");
}

3. 命令注册函数

// 注册命令:添加命令名、函数指针和帮助信息到命令表
int cmd_register(const char *name, cmd_func_t func, const char *help)
{if (cmd_count >= CMD_TABLE_MAX)return -1; // 命令表满了,注册失败// 复制命令名到表项(限制最大长度)strncpy(cmd_table[cmd_count].name, name, CMD_NAME_LEN - 1);cmd_table[cmd_count].name[CMD_NAME_LEN - 1] = '\0';// 设置函数指针和帮助信息cmd_table[cmd_count].func = func;cmd_table[cmd_count].help = help;cmd_count++; // 更新命令数量return 0;
}

4. 命令查找函数

// 查找命令:通过命令名在命令表中查找
cmd_t *cmd_find(const char *name)
{for (int i = 0; i < cmd_count; i++){if (strcmp(cmd_table[i].name, name) == 0)return &cmd_table[i];  // 找到并返回指针}return NULL;  // 未找到
}

5. 命令执行函数

// 执行命令行字符串:拆分参数并调用命令函数
int cmd_execute(const char *cmdline)
{if (cmdline == NULL || *cmdline == '\0')return -1;  // 空命令行,忽略// 使用 buf 保存一份可修改的命令行char buf[128];strncpy(buf, cmdline, sizeof(buf) - 1);buf[sizeof(buf) - 1] = '\0';char *argv[CMD_MAX_ARGS];  // 参数数组int argc = 0;// 使用 strtok 拆分参数char *token = strtok(buf, " ");while (token && argc < CMD_MAX_ARGS){argv[argc++] = token;token = strtok(NULL, " ");}if (argc == 0)return -1;  // 没有有效参数// 查找对应命令cmd_t *cmd = cmd_find(argv[0]);if (!cmd){printf("Unknown command: %s\r\n", argv[0]);return -1;  // 未知命令}// 调用命令函数,传递 argc 和 argvreturn cmd->func(argc, argv);
}

三、命令结构体(cmd_t)

// cmd.h 中结构定义示例
#define CMD_NAME_LEN  16
#define CMD_MAX_ARGS  8typedef int (*cmd_func_t)(int argc, char *argv[]); // 命令处理函数类型typedef struct {char name[CMD_NAME_LEN];   // 命令名称cmd_func_t func;           // 命令处理函数const char *help;          // 帮助字符串
} cmd_t;

四、运行效果示例

假设输入如下命令:

echo Hello STM32

Shell 处理流程如下:

  1. 输入字符拼接成字符串;

  2. 回车后传入 cmd_execute()

  3. strtok 拆分为 argv = {"echo", "Hello", "STM32"}

  4. 查表找到 cmd_echo

  5. 调用 cmd_echo(argc=3, argv)

  6. 控制台输出:

    Hello STM32
    

五、小结

这个命令系统具备以下优点:

  • 轻量级:适合裸机或RTOS;
  • 易扩展:添加命令只需实现函数并调用 cmd_register()
  • 通用接口:命令参数解析和传递简洁统一;
  • 结构清晰:注册、查找、执行职责分离。

适用于嵌入式项目中需要人机交互或调试接口的场景,例如串口控制、调试参数设置、模块测试等。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913247.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于matlab的二连杆机械臂PD控制的仿真

基于matlab的二连杆机械臂PD控制的仿真。。。 chap3_5input.m , 1206 d2plant1.m , 1364 hs_err_pid2808.log , 15398 hs_err_pid4008.log , 15494 lx_plot.m , 885 PD_Control.mdl , 35066 tiaojie.m , 737 chap2_1ctrl.asv , 988 chap2_1ctrl.m , 905

TCP、HTTP/1.1 和HTTP/2 协议

TCP、HTTP/1.1 和 HTTP/2 是互联网通信中的核心协议&#xff0c;它们在网络分层中处于不同层级&#xff0c;各有特点且逐步演进。以下是它们的详细对比和关键特性&#xff1a;1. TCP&#xff08;传输控制协议&#xff09; 层级&#xff1a;传输层&#xff08;OSI第4层&#xff…

Java+Vue开发的进销存ERP系统,集采购、销售、库存管理,助力企业数字化运营

前言&#xff1a;在当今竞争激烈的商业环境中&#xff0c;企业对于高效管理商品流通、采购、销售、库存以及财务结算等核心业务流程的需求日益迫切。进销存ERP系统作为一种集成化的企业管理解决方案&#xff0c;能够整合企业资源&#xff0c;实现信息的实时共享与协同运作&…

【趣谈】Android多用户导致的UserID、UID、shareUserId、UserHandle术语混乱讨论

【趣谈】Android多用户导致的UserID、UID、shareUserId、UserHandle术语混乱讨论 备注一、概述二、概念对比1.UID2.shareUserId3.UserHandle4.UserID 三、结论 备注 2025/07/02 星期三 在与Android打交道时总遇到UserID、UID、shareUserId、UserHandle这些术语&#xff0c;但是…

P1424 小鱼的航程(改进版)

题目描述有一只小鱼&#xff0c;它平日每天游泳 250 公里&#xff0c;周末休息&#xff08;实行双休日)&#xff0c;假设从周 x 开始算起&#xff0c;过了 n 天以后&#xff0c;小鱼一共累计游泳了多少公里呢&#xff1f;输入格式输入两个正整数 x,n&#xff0c;表示从周 x 算起…

<二>Sping-AI alibaba 入门-记忆聊天及持久化

请看文档&#xff0c;流程不再赘述&#xff1a;官网及其示例 简易聊天 环境变量 引入Spring AI Alibaba 记忆对话还需要我们有数据库进行存储&#xff0c;mysql&#xff1a;mysql-connector-java <?xml version"1.0" encoding"UTF-8"?> <pr…

【机器学习深度学习】模型参数量、微调效率和硬件资源的平衡点

目录 一、核心矛盾是什么&#xff1f; 二、微调本质&#xff1a;不是全调&#xff0c;是“挑着调” 三、如何平衡&#xff1f; 3.1 核心策略 3.2 参数量 vs 微调难度 四、主流轻量微调方案盘点 4.1 冻结部分参数 4.2 LoRA&#xff08;低秩微调&#xff09; 4.3 量化训…

【V13.0 - 战略篇】从“完播率”到“价值网络”:训练能预测商业潜力的AI矩阵

在上一篇 《超越“平均分”&#xff1a;用多目标预测捕捉观众的“心跳曲线”》 中&#xff0c;我们成功地让AI学会了预测观众留存曲线&#xff0c;它的诊断能力已经深入到了视频的“过程”层面&#xff0c;能精确地指出观众是在哪个瞬间失去耐心。 我的AI现在像一个顶级的‘心…

java微服务(Springboot篇)——————IDEA搭建第一个Springboot入门项目

在正文开始之前我们先来解决一些概念性的问题 &#x1f355;&#x1f355;&#x1f355; 问题1&#xff1a;Spring&#xff0c;Spring MVC&#xff0c;Spring Boot和Spring Cloud之间的区别与联系&#xff1f; &#x1f36c;&#x1f36c;&#x1f36c;&#xff08;1&#xff0…

服务器间接口安全问题的全面分析

一、服务器接口安全核心威胁 文章目录**一、服务器接口安全核心威胁**![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6f54698b9a22439892f0c213bc0fd1f4.png)**二、六大安全方案深度对比****1. IP白名单机制****2. 双向TLS认证(mTLS)****3. JWT签名认证****4. OAuth…

vs code关闭函数形参提示

问题&#xff1a;函数内出现灰色的形参提示 需求/矛盾&#xff1a; 这个提示对老牛来说可能是一种干扰&#xff0c;比如不好对齐控制一行代码的长度&#xff0c;或者容易看走眼&#xff0c;造成眼花缭乱的体验。 关闭方法&#xff1a; 进入设置&#xff0c;输入inlay Hints&…

ESXi 8.0安装

使用群晖&#xff0c;突然nvme固态坏了 新nvme固态&#xff0c;先在PC上格式化下&#xff0c;不然可能N100可能不认 启动&#xff0c;等待很长时间 回车 F11 输入密码&#xff0c;字母小写字母大写数字 拔掉U盘&#xff0c;回车重启 网络配置 按F2&#xff0c; 输入密码&…

【git学习】第2课:查看历史与版本回退

好的&#xff0c;我们进入 第2课&#xff1a;版本查看与回退机制&#xff0c;本课你将学会如何查看提交历史、对比更改&#xff0c;并掌握多种回退版本的方法。&#x1f4d8; 第2课&#xff1a;查看历史与版本回退&#x1f3af; 本课目标熟练查看 Git 提交记录掌握差异查看、版…

摄像头AI智能识别工程车技术及应用前景展望

摄像头AI自动识别工程车是智能交通系统和工程安全管理领域的一项重要技术。它通过图像识别技术和深度学习算法&#xff0c;实现对工程车的自动检测和识别&#xff0c;从而提高了施工现场的安全性和管理效率。以下是对该技术及其应用的详细介绍&#xff1a;一、技术实现数据收集…

Windows服务器安全配置:组策略与权限管理最佳实践

Windows服务器是企业常用的服务器操作系统&#xff0c;但其开放性和复杂性也使其成为攻击者的目标。通过正确配置组策略和权限管理&#xff0c;可以有效提高安全性&#xff0c;防止未经授权的访问和恶意软件的入侵。以下是详细的安全配置指南和最佳实践。 1. 为什么组策略和权限…

Windows部署Rocketmq问题汇总

最近研究了下Rocketmq消息中间件&#xff0c;在Win10上部署时遇到一些问题&#xff0c;做个记录 部署的是Rocketmq 4.92版本&#xff0c;对应使用的控制台用的1.0版本 下载地址 1.优化内存占用 修改 runserver.cmd 修改前 set "JAVA_OPT%JAVA_OPT% -server -Xms2g -Xmx…

动手学深度学习-学习笔记(总)

文章目录 1、概述2、内容2.1、python2.2、动手学深度学习2.2.1、课前准备2.2.2、预备知识2.2.3、线性神经网络 2.3、深度学习重要概念 3、常见问题3.1、安装 d2l 失败3.2、调用 mean() 方法报错3.3、markdown 常见公式3.4、执行动手学深度学习中的代码&#xff0c;无法显示图片…

springboot3.5 MySQL 自动装配解析

一、配置环境 1. 配置pom.xml <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency> 2、自动配置图解 二、相关代码解析 1、自动配置入口&#xff1a…

使用 Conda 工具链创建 Poetry 本地虚拟环境全记录——基于《Python 多版本与开发环境治理架构设计》

Python 多版本治理理念&#xff08;Windows 平台 零基础友好&#xff09;-CSDN博客 Python 多版本与开发环境治理架构设计-CSDN博客 使用命令行创建项目本地的 Poetry 虚拟环境实战演示 —— 基于《Python 多版本与开发环境治理架构设计》的最佳实践-CSDN博客 一、Python311 环…

北小菜, python , onvif

第一节&#xff1a; 首先是环境的搭建。 环境的搭建。 roottopeet:/home/topeet/source_code/wang_onvif_python# python -m venv venv Command python not found, did you mean:command python3 from deb python3command python from deb python-is-python3 roottopeet:/ho…