在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(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開(kāi)發(fā)或使用過(guò)桌面Linux系統(tǒng)的童鞋們,肯定對(duì)shell命令交互印象比較深刻,然而我們大多數(shù)搞嵌入式軟件開(kāi)發(fā)的碼農(nóng)都是基于單片機(jī),比如51、STM32等進(jìn)行開(kāi)發(fā)的,在單片機(jī)上能否做個(gè)shell命令行交互?答案當(dāng)然是可以的,在網(wǎng)上類(lèi)似的文章和代碼一搜一籮筐, 基本原理: 監(jiān)測(cè)用戶(hù)的輸入,然后到一個(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í)見(jiàn)的標(biāo)準(zhǔn)main函數(shù)的原型就是這樣定義的

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

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

#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ù)名稱(chēng): 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ù)名稱(chēng): 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')) // 找到回車(chē)換行鍵, 說(shuō)明已經(jīng)輸入了一條完整命令
        {
            Cmd_Len = i;            // 記錄命令長(zhǎng)度
            Cmd[i] = '?';
            break;
        }
        else if (Cmd[i] EQ ' ')     // 空格全部替換成'?'
        {
            Cmd[i] = '?';
        }
    }


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


    if (Cmd_Len EQ 0)               // 全部輸入的是空格或者回車(chē)
    {
        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:**只有命令,沒(méi)有參數(shù)

/***************************************************************
* 函數(shù)名稱(chēng): 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ù)名稱(chēng): 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ù)名稱(chēng): 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命令的基本用法,至于如何捕捉用戶(hù)的輸入,方式和方法就很多了,不過(guò)常用的就下面的幾種情況:

  1. 終端設(shè)備上的串口(這種最常見(jiàn))
  2. 終端設(shè)備上的網(wǎng)口(稍微有點(diǎn)門(mén)檻,后面會(huì)專(zhuān)門(mén)寫(xiě)一篇STM32的文章介紹這種用法)
  3. 如果終端設(shè)備已經(jīng)登錄了后臺(tái)主站云平臺(tái),直接在云平臺(tái)上給終端設(shè)備下發(fā)shell命令
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)注

    5082

    文章

    19126

    瀏覽量

    305249
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

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

    關(guān)注

    3

    文章

    4331

    瀏覽量

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

    關(guān)注

    1

    文章

    1017

    瀏覽量

    21347
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    圖形用戶(hù)界面與命令行接口的比較

    在計(jì)算機(jī)科學(xué)和信息技術(shù)領(lǐng)域,用戶(hù)與計(jì)算機(jī)交互的方式主要分為兩種:圖形用戶(hù)界面(GUI)和命令行接口(CLI)。這兩種界面各有優(yōu)勢(shì)和局限性,適用于不同的場(chǎng)景和用戶(hù)需求。 1. 定義與基本特征 圖形用戶(hù)
    的頭像 發(fā)表于 11-12 14:38 ?348次閱讀

    Mobaxterm 的命令行使用方法

    的遠(yuǎn)程桌面協(xié)議(如RDP和VNC),以及文件傳輸協(xié)議(如FTP和SFTP)。本文將詳細(xì)介紹如何使用Mobaxterm的命令行功能。 2. 安裝 Mobaxterm 在開(kāi)始之前,確保你已經(jīng)安裝
    的頭像 發(fā)表于 11-11 09:08 ?1278次閱讀

    Linux系統(tǒng)中shell命令解析

    shell是Linux系統(tǒng)的用戶(hù)界面,提供了用戶(hù)與內(nèi)核交互的一種接口,它接收用戶(hù)輸入的命令并到送到內(nèi)核去執(zhí)行,因此也被稱(chēng)為L(zhǎng)inux的命令解釋器。
    的頭像 發(fā)表于 11-05 15:40 ?268次閱讀

    APM32F411板的python+pyocd命令行操作

    前段時(shí)間學(xué)習(xí)了一下如何使用pyocd配合APM32F411VCTINY板在命令行下給它進(jìn)行各種騷操作,在使用一段時(shí)間后就想著:pyocd是基于python的,那是不是也可以使用python腳本+pyocd使用起來(lái)呢?
    的頭像 發(fā)表于 10-18 16:21 ?271次閱讀
    APM32F411板的python+pyocd<b class='flag-5'>命令行</b>操作

    shell具有的功能和特點(diǎn)

    Shell 是一個(gè)命令行解釋器,用于與操作系統(tǒng)進(jìn)行交互。它提供了一種方便的方式來(lái)執(zhí)行命令、管理文件和目錄、運(yùn)行程序等。以下是 Shell
    的頭像 發(fā)表于 08-30 14:48 ?517次閱讀

    鴻蒙ArkUI-X跨平臺(tái)開(kāi)發(fā):【命令行工具(ACE Tools)】

    ACE Tools是一套為ArkUI-X項(xiàng)目跨平臺(tái)應(yīng)用開(kāi)發(fā)者提供的命令行工具,支持在Windows/Ubuntu/macOS平臺(tái)運(yùn)行,用于構(gòu)建OpenHarmony/HarmonyOS、Android和iOS平臺(tái)的應(yīng)用程序,其功能包括開(kāi)發(fā)環(huán)境檢查,新建項(xiàng)目,編譯打包,安裝調(diào)試等。
    的頭像 發(fā)表于 05-21 17:39 ?1788次閱讀
    鴻蒙ArkUI-X跨平臺(tái)開(kāi)發(fā):【<b class='flag-5'>命令行</b>工具(ACE Tools)】

    高效云端管理的秘訣——華為云命令行工具 KooCLI

    發(fā)現(xiàn)了云上命令行工具,我的云端管理效率從此得到了質(zhì)的飛躍。 我從華為云官方產(chǎn)品幫助文檔中了解了 KooCLI 工具,文檔中介紹的便捷操作和高效管理讓我心動(dòng)不已,于是,我開(kāi)啟了我的體驗(yàn)。通過(guò)簡(jiǎn)單的命令行輸入,我能夠快速完成
    的頭像 發(fā)表于 05-10 00:25 ?704次閱讀
    高效云端管理的秘訣——華為云<b class='flag-5'>命令行</b>工具 KooCLI

    鴻蒙OpenHarmony南向:【Hi3516標(biāo)準(zhǔn)系統(tǒng)入門(mén)(命令行方式)】

    除小型系統(tǒng)外,Hi3516DV300開(kāi)發(fā)板還支持標(biāo)準(zhǔn)系統(tǒng)。此章節(jié)簡(jiǎn)要介紹如何使用命令行在Hi3516DV300開(kāi)發(fā)板上進(jìn)行標(biāo)準(zhǔn)系統(tǒng)的開(kāi)發(fā)。
    的頭像 發(fā)表于 05-08 09:26 ?885次閱讀
    鴻蒙OpenHarmony南向:【Hi3516標(biāo)準(zhǔn)系統(tǒng)入門(mén)(<b class='flag-5'>命令行</b>方式)】

    STM8 flash loader命令行調(diào)用錯(cuò)誤的原因?

    [td]我目前在用flash loader的命令行,編寫(xiě)自己的上位機(jī)軟件來(lái)升級(jí)程序,但是在用命令行調(diào)用的時(shí)候一直出錯(cuò),有人能幫忙分析下嗎? 我編寫(xiě)的bat文件
    發(fā)表于 05-06 07:23

    HarmonyOS開(kāi)發(fā):【基于命令行(安裝庫(kù)和工具集)】

    使用命令行進(jìn)行設(shè)備開(kāi)發(fā)時(shí),可以通過(guò)以下步驟安裝編譯OpenHarmony需要的庫(kù)和工具。
    的頭像 發(fā)表于 04-25 21:03 ?420次閱讀
    HarmonyOS開(kāi)發(fā):【基于<b class='flag-5'>命令行</b>(安裝庫(kù)和工具集)】

    香港vps的centos如何切換命令行和桌面?

    要在CentOS上切換命令行和桌面環(huán)境,您可以通過(guò)以下步驟進(jìn)行: 1、安裝桌面環(huán)境:如果您的CentOS VPS上還沒(méi)有安裝圖形桌面環(huán)境,您需要安裝一個(gè)。一般來(lái)說(shuō),常用的桌面環(huán)境有GNOME、KDE
    的頭像 發(fā)表于 04-10 17:41 ?660次閱讀

    STM32G070RB使用jlink命令行下載無(wú)法識(shí)別芯片怎么解決?

    STM32G070RB 使用jlink命令行下載無(wú)法識(shí)別芯片,想手動(dòng)添加芯片,請(qǐng)問(wèn)哪里可以下載驅(qū)動(dòng).elf文件 或者有什么方法能夠?qū)崿F(xiàn)jlink命令行下載
    發(fā)表于 04-02 06:15

    人機(jī)交互的三個(gè)階段 人機(jī)交互的常用方式

    機(jī)交互經(jīng)歷的三個(gè)階段:命令行界面交互階段、圖形用戶(hù)界面交互階段、自然和諧的人機(jī)交互階段。
    的頭像 發(fā)表于 03-13 17:25 ?3076次閱讀

    tasking的命令行控制中如何生成makefiles文件?

    tasking的命令行控制中如何生成makefiles文件?
    發(fā)表于 02-06 07:56

    在Linux上如何通過(guò)命令行來(lái)更改日期和時(shí)間?

    在Linux上如何通過(guò)命令行來(lái)更改日期和時(shí)間? 在Linux上,我們可以使用命令行工具來(lái)更改日期和時(shí)間。操作系統(tǒng)中有一個(gè)專(zhuān)門(mén)的命令被稱(chēng)為“date”命令,它允許我們更改系統(tǒng)的當(dāng)前日期和
    的頭像 發(fā)表于 01-16 17:10 ?2836次閱讀
    主站蜘蛛池模板: www在线视频在线播放| 天天操天天谢| 国产美女一级片| 老师下面好湿好紧好滑好想要| 四虎在线免费视频| 国产精品免费观看网站| 国产网红主播精品福利大秀专区| 国产在线成人一区二区| 青草视频久久| 午夜国产理论| 亚洲激情网站| 日本精品一卡二卡≡卡四卡| 午夜视频一区| 亚洲美女黄视频| 欧洲综合色| 天天干天天做天天操| 一区中文字幕| 欧美特黄一区二区三区| 天天干天天添| 国产在线一区视频| 久久看免费视频| 久久久久大香线焦| 天天综合久久| 亚洲 [12p]| 久久伊人网站| 国产视频福利| 四虎永久影院永久影库| 在线看免费| 日本不卡1| 黄色大片免费观看| free chinese 国产精品| 色婷婷综合在线| 天天射天天干天天插| 成人精品一级毛片| 国产黄页| 在线99热| 国产资源在线播放| 34pao强力打造免费永久视频| 欧美一级在线观看播放| 久久草在线视频国产一| 四虎影院在线免费观看视频|