日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)上如何做shell命令行交互

麥辣雞腿堡 ? 來(lái)源:嵌入式軟件那些事 ? 作者:靜以修身 ? 2023-11-01 15:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

做過(guò)嵌入式Linux開發(fā)或使用過(guò)桌面Linux系統(tǒng)的童鞋們,肯定對(duì)shell命令交互印象比較深刻,然而我們大多數(shù)搞嵌入式軟件開發(fā)的碼農(nóng)都是基于單片機(jī),比如51、STM32等進(jìn)行開發(fā)的,在單片機(jī)上能否做個(gè)shell命令行交互?答案當(dāng)然是可以的,在網(wǎng)上類似的文章和代碼一搜一籮筐, 基本原理: 監(jiān)測(cè)用戶的輸入,然后到一個(gè)命令查找表里過(guò)濾是否可以找到該命令,如果可以則調(diào)用對(duì)應(yīng)的處理函數(shù),當(dāng)然做的好點(diǎn)的話還可以向處理函數(shù)傳遞參數(shù)。

主要的數(shù)據(jù)結(jié)構(gòu)及解析函數(shù)定義如下,注意這里函數(shù)指針的定義,Argc代表參數(shù)的個(gè)數(shù),可以為0、1、2...,Argv用于存放具體的參數(shù),可能有些童鞋要問(wèn)為啥定義成CHAR **,這是因?yàn)槲覀冊(cè)趕hell交互窗口輸入的內(nèi)容都會(huì)被當(dāng)作ASCII碼字符串,所以只能用CHAR *來(lái)指向它們,另外又因?yàn)槲覀兛赡軙?huì)輸入多個(gè)字符串參數(shù)(多個(gè)參數(shù)以空格進(jìn)行間隔),所以要使用二級(jí)指針CHAR **,可能有的同學(xué)會(huì)發(fā)現(xiàn),我們平時(shí)見的標(biāo)準(zhǔn)main函數(shù)的原型就是這樣定義的

int main(int argc, char *argv[])

char *argv[]與char **argv是等價(jià)的,這個(gè)就不需要解釋了吧,采用這種定義方式可以非常靈活,具體見下面的用法示例:

#define SHELL_MAX_PARA_NUM      20                         //最多支持20個(gè)命令參數(shù)


// 函數(shù)指針
typedef UINT8 (* Cmd_Analys_Fun_P)(UINT8 Argc, CHAR **Argv);


typedef struct
{
    CHAR *pName;
    Cmd_Analys_Fun_P pCmdFunc;    // 命令解析函數(shù)
} S_Shell_Cmd;


/***************************************************************
* 函數(shù)名稱: Shell_Proc
* 功能描述: Shell交互處理
* 輸入?yún)?shù): 
* 輸出參數(shù): 
* 返 回 值: 
****************************************************************/
UINT8 Shell_Proc(CHAR *ucCmd, UINT8 ucCmdLength)
{
    UINT8 Result;


    Result = Cmd_Analys(Shell_Cmd, S_NUM(Shell_Cmd), ucCmd, ucCmdLength);
    if ((Result EQ 1) || (Result EQ 2))
    {
        //vConsoleLog("[shell]#");
    }


    return Result;
}


/***************************************************************
* 函數(shù)名稱: Cmd_Analys
* 功能描述: 命令解析
* 輸入?yún)?shù): 
* 輸出參數(shù): 
* 返 回 值:  
****************************************************************/
LOCAL UINT8 Cmd_Analys(CONST S_Shell_Cmd Shell_Cmd[], UINT8 Num, CHAR Cmd[], UINT8 Len)
{
    UINT8 i, j;
    UINT8 Argc, Cmd_Len;
    CHAR  *(Argv[SHELL_MAX_PARA_NUM]);


    Cmd_Len = 0;
    for (i = 0; i < Len; i++)
    {
        if ((Cmd[i] EQ 'r') || (Cmd[i] EQ 'n')) // 找到回車換行鍵, 說(shuō)明已經(jīng)輸入了一條完整命令
        {
            Cmd_Len = i;            // 記錄命令長(zhǎng)度
            Cmd[i] = '?';
            break;
        }
        else if (Cmd[i] EQ ' ')     // 空格全部替換成'?'
        {
            Cmd[i] = '?';
        }
    }


    if (i EQ Len)                   // 沒有找到命令
    {
        return 0;
    }


    if (Cmd_Len EQ 0)               // 全部輸入的是空格或者回車
    {
        vConsoleLog("rnShell:");  // 提示輸入新的命令
        return 1;
    }


    for (i = 0; i < Num; i++)
    {
        if (strcmp(Shell_Cmd[i].pName, Cmd) != 0)
        {
            continue;
        }


        j = (UINT8)strlen(Cmd);
        Argc = 0;
        while (j < Cmd_Len)
        {
            if (Cmd[j] EQ '?' && Cmd[j + 1] != '?') // 前一個(gè)是空格,后一個(gè)非空格,說(shuō)明是一個(gè)新參數(shù)
            {
                if (Argc < SHELL_MAX_PARA_NUM)
                {
                    Argv[Argc] = &Cmd[j + 1];
                    Argc++;
                }
                else
                {
                    break;
                }
            }


            j++;
        }


        // 執(zhí)行命令
        (*Shell_Cmd[i].pCmdFunc)(Argc, Argv);
        break;
    }


    if (i EQ Num)
    {
        vConsoleLog("Cmd Error!");
        return 2;
    }


    return 1;
}

**用法1:**只有命令,沒有參數(shù)

/***************************************************************
* 函數(shù)名稱: RebootTerminal
* 功能描述: 重啟終端
* 輸入?yún)?shù): 
* 輸出參數(shù): 
* 返 回 值: 
****************************************************************/
LOCAL UINT8 RebootTerminal(UINT8 argc, CHAR **argv)
{
    //發(fā)起復(fù)位請(qǐng)求
    udwResetTimeCounter = 0;
    blResetRequestFlag  = TRUE;
    vConsoleLog("Terminal Prepare Reboot ...");


    return 1;
}

**用法2:**命令+1個(gè)參數(shù)

/***************************************************************
* 函數(shù)名稱: ConsoleOutputRedirect
* 功能描述: console輸出重定向
* 輸入?yún)?shù): 
* 輸出參數(shù): 
* 返 回 值: 
****************************************************************/
LOCAL UINT8 ConsoleOutputRedirect(UINT8 argc, CHAR **argv)
{
    if (argc != 1)
    {
        vConsoleLog("miss argumentrn");
        return 0;
    }

    if (!strcmp(argv[0], "on"))
    {
        ucConsoleRedirectFlag = 1;
        vConsoleLog("console output redirect to tcpconsolern");
    }
    else if (!strcmp(argv[0], "off"))
    {
        ucConsoleRedirectFlag = 0;
        vConsoleLog("console output redirect to localconsolern");
    }
    else
    {
        vConsoleLog("error argumentrn");
        return 0;
    }


    return 1;
}

**用法3:**命令+N個(gè)參數(shù)

/***************************************************************
* 函數(shù)名稱: SetTerminalTime
* 功能描述: 設(shè)置終端時(shí)間
* 輸入?yún)?shù): 
* 輸出參數(shù): 
* 返 回 值: 
****************************************************************/
LOCAL UINT8 SetTerminalTime(UINT8 argc, CHAR **argv)
{
    UINT8 ucTime[6];


    if (argc != 6)
    {
        vConsoleLog("Param Err! argc = %d", argc);
        return 0;
    }


    ucTime[0] = strtoul(argv[0], NULL, 0);
    ucTime[1] = strtoul(argv[1], NULL, 0);
    ucTime[2] = strtoul(argv[2], NULL, 0);
    ucTime[3] = strtoul(argv[3], NULL, 0);
    ucTime[4] = strtoul(argv[4], NULL, 0);
    ucTime[5] = strtoul(argv[5], NULL, 0);


    ucTimeTestFlag = 1;


    stCurrentTime.ucYear  = ucTime[0];
    stCurrentTime.ucMonth = ucTime[1];
    stCurrentTime.ucDay   = ucTime[2];
    stCurrentTime.ucHour  = ucTime[3];
    stCurrentTime.ucMin   = ucTime[4];
    stCurrentTime.ucSec   = ucTime[5];


    vConsoleLog("SetTerminalTime: %02d/%02d/%02d %02d:%02d:%02d", ucTime[0], ucTime[1], ucTime[2], 
                                                                  ucTime[3], ucTime[4], ucTime[5]);


    return 1;
}

以上三種用法,基本可以涵蓋現(xiàn)實(shí)中的各種使用需求!

以上就是shell命令的基本用法,至于如何捕捉用戶的輸入,方式和方法就很多了,不過(guò)常用的就下面的幾種情況:

  1. 終端設(shè)備上的串口(這種最常見)
  2. 終端設(shè)備上的網(wǎng)口(稍微有點(diǎn)門檻,后面會(huì)專門寫一篇STM32的文章介紹這種用法)
  3. 如果終端設(shè)備已經(jīng)登錄了后臺(tái)主站云平臺(tái),直接在云平臺(tái)上給終端設(shè)備下發(fā)shell命令
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5210

    文章

    20680

    瀏覽量

    337365
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11822

    瀏覽量

    219600
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4422

    瀏覽量

    67869
  • 系統(tǒng)
    +關(guān)注

    關(guān)注

    1

    文章

    1047

    瀏覽量

    22407
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    ROC rk3588s PC的uboot命令行的啟動(dòng)

    到了 Ubuntu 啟動(dòng)流程。根據(jù)您的 Wiki 指導(dǎo),我曾嘗試在啟動(dòng)時(shí)通過(guò)串口終端反復(fù)按下 Ctrl+C、空格等按鍵,但始終無(wú)法進(jìn)入 U-Boot 命令行。我懷疑是 U-Boot 環(huán)境變量中的 bootdelay
    發(fā)表于 04-06 21:40

    涂鴉CLI正式開源:讓AI Agent一行命令管理3000+品類智能設(shè)備

    和AIAgent直接調(diào)用。背后的邏輯很明確:命令行是AI編程Agent最成熟的交互方式,Agent天生適合執(zhí)行結(jié)構(gòu)化的CLI指令。辦公場(chǎng)景的CLI化已經(jīng)走在前面。但對(duì)AI
    的頭像 發(fā)表于 04-02 18:10 ?377次閱讀
    涂鴉CLI正式開源:讓AI Agent一行<b class='flag-5'>命令</b>管理3000+品類智能設(shè)備

    運(yùn)維工程師必須掌握的10個(gè)系統(tǒng)命令

    系統(tǒng)命令是運(yùn)維工程師與服務(wù)器交互的基礎(chǔ)工具。雖然現(xiàn)代運(yùn)維工作有大量的自動(dòng)化工具和平臺(tái),但掌握核心系統(tǒng)命令仍然必要。命令行工具響應(yīng)速度快、不依賴圖形界面、可以組合使用應(yīng)對(duì)復(fù)雜場(chǎng)景。在服務(wù)
    的頭像 發(fā)表于 03-23 10:28 ?232次閱讀

    Kubernetes kubectl命令行工具詳解

    kubectl是Kubernetes官方提供的命令行工具,作為與Kubernetes集群交互的主要接口,它通過(guò)調(diào)用Kubernetes API Server實(shí)現(xiàn)對(duì)集群資源的全面管理。在生產(chǎn)環(huán)境中,運(yùn)維工程師需要熟練掌握kubectl命令
    的頭像 發(fā)表于 02-02 16:40 ?626次閱讀

    命令行阿里千問(wèn)搭建過(guò)程

    克隆千問(wèn)倉(cāng)庫(kù),安裝依賴; 下載模型權(quán)重; 命令行執(zhí)行啟動(dòng)腳本,配置參數(shù)后運(yùn)行推理。
    發(fā)表于 12-24 10:35

    shell基本介紹及常用命令shell基本介紹

    提示符是“$”,在命令提示符后邊輸入命令即可和系統(tǒng)進(jìn)行交互操作。ubuntu默認(rèn)的Shell是Bash(Bourne Again Shell
    發(fā)表于 09-28 09:05

    人機(jī)交互:連接人類與數(shù)字世界的橋梁

    )等技術(shù)的發(fā)展,人機(jī)交互已經(jīng)從傳統(tǒng)的鍵盤鼠標(biāo)操作,演進(jìn)為語(yǔ)音識(shí)別、手勢(shì)控制、腦機(jī)接口等更自然、更智能的交互方式。 ? 人機(jī)交互的發(fā)展歷程 早期的人機(jī)交互主要依賴
    的頭像 發(fā)表于 08-11 15:21 ?2342次閱讀

    所見即所得——Luban-Lite VS Code插件讓開發(fā)實(shí)現(xiàn)“命令行自由”

    NEWS所見即所得!Luban-LiteVSCode插件指南親愛的開發(fā)者朋友們,你是否還在為嵌入式開發(fā)中頻繁切換命令行而抓狂?配置環(huán)境參數(shù)如“走迷宮”,編譯燒錄還需切換AiBurn?今天,匠芯創(chuàng)為您
    的頭像 發(fā)表于 08-07 15:38 ?1265次閱讀
    所見即所得——Luban-Lite VS Code插件讓開發(fā)實(shí)現(xiàn)“<b class='flag-5'>命令行</b>自由”

    解析K8S實(shí)用命令

    前言: 作為運(yùn)維工程師,掌握 Kubernetes 命令行工具是日常工作的核心技能。本文將深入解析 K8S 最實(shí)用的命令,從基礎(chǔ)操作到高級(jí)技巧,助你成為容器化集群管理專家。
    的頭像 發(fā)表于 07-24 14:07 ?1022次閱讀

    USB串行配置實(shí)用程序是否有可用的命令行版本?

    USB串行配置實(shí)用程序是否有可用的命令行版本?
    發(fā)表于 07-22 08:09

    【RA-Eco-RA6M4開發(fā)板評(píng)測(cè)】移植shell實(shí)現(xiàn)命令交互

    _cmd_cfg*)g_shell_cmd_list_ast, 1); 執(zhí)行 while(1){shell_exec();} 三. 測(cè)試輸入help查看支持的命令 四. 總結(jié)以上基于串口接口即可快速的移植
    發(fā)表于 07-19 22:47

    淺談wsl --update` 命令行選項(xiàng)無(wú)效的解決方案

    PS C:\Users\Administrator> wsl --update >> 命令行選項(xiàng)無(wú)效: --update
    的頭像 發(fā)表于 06-27 10:28 ?1.2w次閱讀

    STM32單片機(jī)片上數(shù)字濾波器操作文檔 快速入門數(shù)字濾波器在單片機(jī)上的實(shí)現(xiàn)

    這個(gè)文檔,是為了幫助大家快速入門數(shù)字濾波器在單片機(jī)上的實(shí)現(xiàn)。
    的頭像 發(fā)表于 06-23 16:53 ?1957次閱讀
    STM32<b class='flag-5'>單片機(jī)</b>片上數(shù)字濾波器操作文檔 快速入門數(shù)字濾波器在<b class='flag-5'>單片機(jī)上</b>的實(shí)現(xiàn)

    2025科大訊飛智能交互產(chǎn)品升級(jí)發(fā)布會(huì)定檔

    命令行到圖形界面,從觸屏操作到語(yǔ)音助手,技術(shù)浪潮重新定義人機(jī)交互的邊界。當(dāng)大模型的智慧涌現(xiàn),機(jī)器從“能聽會(huì)說(shuō)”真正走向“能理解會(huì)思考”,那么未來(lái)交互的新范式將是什么?
    的頭像 發(fā)表于 06-11 17:12 ?1395次閱讀

    【米爾-RK3562開發(fā)板試用評(píng)測(cè)】命令行功能測(cè)試-shell腳本進(jìn)行IO控制-(綠色)RUN 燈、(紅色)User燈

    shell腳本進(jìn)行命令行功能測(cè)試 控制部分硬件測(cè)試。從IO控制-燈閃開始。 板手冊(cè)中LED例: **應(yīng)開發(fā)板上的 RUN 燈 為例進(jìn)行LED燈測(cè)試 root@myd-yr3562:~# cd
    發(fā)表于 05-09 18:19
    荃湾区| 清河县| 宜宾县| 西藏| 临泉县| 宜州市| 红河县| 博兴县| 宁乡县| 鄂托克旗| 永昌县| 方正县| 武定县| 沽源县| 宿州市| 宣恩县| 休宁县| 商城县| 宕昌县| 南川市| 锦州市| 黄浦区| 色达县| 雷山县| 自贡市| 汶上县| 册亨县| 溆浦县| 德江县| 华蓥市| 当阳市| 凤台县| 灵寿县| 百色市| 六枝特区| 大理市| 中西区| 黄冈市| 彩票| 宜章县| 兴文县|