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
英文地址,請注明出處:http://en.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…