在平常嵌入式開發中,咱們常常會用串口命令來使設備進入某種特定的狀態,或執行某個特定的操做。如系統自檢,模擬運行,或者進入手動模式進行設備點動。linux下有強大的shell工具,可讓用戶和片上系統進行交互,而在傳統的單片機系統中,用戶每每須要自行實現一套相似的交互工具。AliOS-Things原生帶有一套名爲cli(command-line interface)的命令行交互工具,在提供基本的系統交互命令的基礎上,也支持用戶自定義命令。本文將介紹如何自定義cli命令並執行。linux
咱們經過在《【AliOS Things學習筆記】在Developerkit開發板上運行blink例程》基礎上,註冊一個cli命令,經過命令行的方式控制LED的亮滅的例子,來演示一個帶有參數的cli命令如何被註冊以及調用。ios
首先,咱們先保證Developerkit的原有cli功能可用。將開發板經過USB鏈接線和PC鏈接。 shell
windows用戶經過設備管理器確認開發板所虛擬出的串口號,MAC和linux用戶可用在終端中輸入以下命令來查看USB串口是否已正確鏈接。windows
ls /dev/tty.*
若是出現以下設備列表,則表示鏈接正確。usbmodem後的數字可能會由於計算機不一樣而不一樣。數組
/dev/tty.usbmodem14103
此時,可用打開PC上的串口調試工具,設置對應的串口,波特率默認爲115200bps。建議串口調試助手具有終端功能,這樣會在cli的使用中有更好的體驗。接下來我將以植入VScode中的aos-cube工具的串口監視器功能爲例進行演示。打開VScode,確保已經按照alios-studio和aos-cube插件。點擊alios-studio工具條中的「插頭」按鈕,啓動串口monitor緩存
若是工具沒能正確地打開串口,也能夠嘗試在控制檯中使用命令行的方式啓動串口monitor。命令格式以下:app
aos monitor /dev/tty.usbmodem14103 115200 #mac linux下命令 aos monitor com5 115200 #windows 下命令
成功進入串口monitor後,會從終端中打印出幫助信息。輸入回車,會出現「#」提示符,此時就能夠輸入命令了。函數
--- Miniterm on /dev/tty.usbmodem14103 115200,8,N,1 --- --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- # #
輸入「help」回車,會看到當前支持的cli命令工具
# help ====Build-in Commands==== ====Support 4 cmds once, seperate by ; ==== help : print this p : print memory m : modify memory echo : echo for command exit : close CLI devname : print device name sysver : system version reboot : reboot system time : system time ota : system ota ====User Commands==== loglevel : set log level tasklist : list all thread info dumpsys : dump system info udp : [ip] [port] [string data] send udp data wifi_debug: wifi debug mode mac : get/set mac kv : kv [set key value | get key | del key | list] version : show version #
輸入「tasklist」,能夠看到現有的任務運行狀況oop
# tasklist ------------------------------------------------------------------------ cpu usage period = 25 CPU usage : 1.89 ------------------------------------------------------------------------ Name State Prio StackSize MinFreesize Runtime %CPU Candidate ------------------------------------------------------------------------ dyn_mem_proc_task PEND 6 256 216 22 0.00 N idle_task RDY 61 200 177 745102697 98.11 N DEFAULT-WORKQUEUE PEND 20 768 738 23 0.00 N timer_task PEND 5 300 254 25 0.00 N aos-init PEND 32 1536 1389 1419569 1.38 N cli RDY 60 512 271 491760 0.47 Y ------------------------------------------------------------------------
到此,咱們已經驗證了cli功能在Developerkit開發板上,接下咱們開始註冊和使用本身的cli命令。
咱們依然打開blink.c文件,在其中添加代碼實現。首先,cli命令的註冊,依賴於一個名爲cli_command結構體,結構體描述以下:
struct cli_command { const char *name; // 命令體,字符串 const char *help; // 命令的幫助說明文本,字符串 void (*function)(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv); // 命令被執行時實際調用的功能函數 };
在本例中,咱們將cli命令命名爲「led_switch」,幫助文本字符串爲「[on] turn on led2;[off] trun off led2」
接下來咱們來實現cli命令的功能函數。將下面函數直接加入blink.c文件中。
static void led_switch(char *pwbuf, int blen, int argc, char **argv) { if(argc == 1) // 若是參數爲空,則報錯返回 { LOG("參數錯誤"); return; } if(strcmp(argv[1],"on") == 0) // 若是輸入參數爲「on」,則點亮led { hal_gpio_output_low(&led); // GPIO輸出低,點亮LED2 } else { hal_gpio_output_high(&led); // GPIO輸出高,熄滅LED2 } }
cli函數具備固定的形式和參數,參考上述函數實現,用戶只須要修改函數名,請保持參數與上述函數一致,參數的意義以下:
參數名稱參數描述char *pwbuf當函數執行完成返回時,經過控制檯打印出來的字符串指針。能夠不傳入。int blen上述字符串長度int argc命令調用時傳入的參數長度,沒有參數傳入時爲1char **argv傳入參數緩存,字符串。第一個有效參數的角標從1開始。
接下來填寫註冊用結構體,以便將命令信息傳遞給cli服務。按照前所講的設計,註冊結構體信息以下,將結構體拷貝到blink.c文件中。
struct cli_command led_switch_command[] = { { .name = "led_switch", // 命令名稱 .help = "[on] turn on led2;[off] trun off led2",// 幫助文本 .function = led_switch // 命令具體執行的函數指針 } };
將cli命令註冊到系統中。cli命令註冊只須要一個函數以下:
aos_cli_register_commands(&led_switch_command[0],1);
函數須要傳入兩個參數,參數1爲剛剛建立的命令信息體的結構體指針;參數2,爲本次須要註冊的命令數,也就是說能夠一次性註冊多個命令,只須要在命令信息結構體中,用數組的方式同時填入幾個命令的信息便可。
將上述函數調用加入到blink.c文件application_start函數的以下位置:
aos_cli_register_commands(&led_switch_command[0],1); // 註冊cli命令函數 aos_loop_run();
至此,一個cli命令的實現和註冊的代碼編寫部分就完成了。編譯並下載至開發板中運行。在cli控制檯輸入help,看到led_switch命令已註冊成功。
# help ====Build-in Commands==== ====Support 4 cmds once, seperate by ; ==== help : print this p : print memory m : modify memory echo : echo for command exit : close CLI devname : print device name sysver : system version reboot : reboot system time : system time ota : system ota ====User Commands==== loglevel : set log level tasklist : list all thread info dumpsys : dump system info udp : [ip] [port] [string data] send udp data wifi_debug: wifi debug mode mac : get/set mac kv : kv [set key value | get key | del key | list] version : show version led_switch: [on] turn on led2;[off] trun off led2
測試命令是否執行,在命令提示符下輸入以下命令,並回車:
#led_switch on
led2點亮
測試參數有效性判斷,輸入以下指令,不帶參數。命令按設計返回錯誤報警。
## led_switch [1291080]<V> 參數錯誤
趕快試試,加入本身的cli功能吧!
本文爲雲棲社區原創內容,未經容許不得轉載。