創(chuàng)建自己的微控制器的命令提示符
動(dòng)機(jī)
最近我為CYD-Klipper固件做了一個(gè)貢獻(xiàn),以支持crowpanel 2.8英寸顯示器。
在瀏覽存儲(chǔ)庫(kù)并了解固件是如何實(shí)現(xiàn)的過(guò)程中,我遇到了一個(gè)名為serial_console.cpp的模塊。在這個(gè)模塊中,作者直接通過(guò)串口實(shí)現(xiàn)了一個(gè)類似終端的功能。這樣做的目的是在運(yùn)行時(shí)更改設(shè)備配置,而不需要重新構(gòu)建代碼和重新刷新MCU。
此外,用戶可以向serial_console添加更多命令,這些命令可以接受參數(shù)以進(jìn)一步增強(qiáng)控制臺(tái)的功能。這個(gè)實(shí)現(xiàn)感覺(jué)非常有趣和酷,所以我決定創(chuàng)建我自己的串行提示符。
目標(biāo)
我希望基于以下目標(biāo)和約束去開(kāi)發(fā)這個(gè)項(xiàng)目:
它應(yīng)該在一個(gè)頭文件中用C語(yǔ)言完全開(kāi)發(fā)。
我應(yīng)該能夠在我的Linux機(jī)器上測(cè)試提示符,而不需要不斷地將代碼flash和構(gòu)建到MCU。
它應(yīng)該可移植到各種mcu,如ESP32, STM和Raspberry Pi Pico(我主要使用)。
最后,串行控制臺(tái)提示符應(yīng)該是這樣的:
設(shè)計(jì)
For -它應(yīng)該在一個(gè)頭文件中使用C語(yǔ)言完全開(kāi)發(fā)。
為此,我將使serial_prompt.h和main.c下的所有邏輯都包括此頭以使用串行提示符。
For -我應(yīng)該能夠在我的Linux機(jī)器上測(cè)試提示,而不需要連續(xù)地將構(gòu)建flash到MCU。
為了在我的終端中模擬mcu串行控制臺(tái),我需要對(duì)我的linux終端執(zhí)行一些手動(dòng)配置。
這部分代碼將終端輸入模式從默認(rèn)的行緩沖模式(只在按Enter鍵后處理輸入)切換到原始模式,在這種模式下,每次按下鍵都可以立即對(duì)程序可用。它還禁用輸入字符的回顯。
恢復(fù)終端的先前狀態(tài)。
如果按CTRL+C退出代碼,還需要恢復(fù)終端的先前狀態(tài)。
以及主要功能。
“它應(yīng)該可以在各種mcu上移植,比如ESP32, STM和Raspberry Pi Pico(主要是我使用的)”
為了使其在各種目標(biāo)之間可移植,我讓用戶基于該板所支持的API定義PRINT和READ宏。如
注意:我沒(méi)有嘗試使用EspIDF,因?yàn)槲乙恢痹趀sp32上使用Arduino框架。
用法
在項(xiàng)目中包含serial_prompt.h頭文件以使用它。
步驟1:替換串行打印/寫(xiě)入功能,這里我以Arduino框架為例。
對(duì)于raspberry pi pico,使用rasspberry_pico_main.c
步驟2:包含標(biāo)題
步驟3:注意:命令處理程序應(yīng)該有**int (int argc, char argv)定義。
步驟4:將命令名稱及其處理程序添加到命令數(shù)組中
步驟5:定期打電話
步驟6:將固件Flash到設(shè)備上,如下所示
如果您輸入“?”,您應(yīng)該看到可用的cmd列表
步驟7:對(duì)于帶有參數(shù)的命令,例如:
輸出
初始化:
?當(dāng)系統(tǒng)啟動(dòng)時(shí),執(zhí)行setup()函數(shù)。
?調(diào)用serial_greet()函數(shù),向用戶顯示問(wèn)候消息:“Hello from Serial Prompt\nType '? ”“尋求幫助\n>”。
命令輸入:
?程序進(jìn)入loop()函數(shù),其中反復(fù)調(diào)用serial_run()。
?在serial_run()中,程序通過(guò)串行連接等待用戶輸入,捕捉字符,直到接收到換行符(\n)。
分詞輸入:
?使用tokenize()將輸入標(biāo)記為單個(gè)單詞(例如命令及其參數(shù))。
?假定第一個(gè)令牌是命令(例如,help)。
命令查找:
?find()函數(shù)被調(diào)用來(lái)檢查命令是否存在于commands[]數(shù)組中。
?如果找到該命令,則調(diào)用相應(yīng)的處理函數(shù)(如help())。
?如果命令未知,則打印“unknown command”錯(cuò)誤信息。
命令執(zhí)行:
?在這種情況下,如果用戶輸入help,則執(zhí)行help()處理程序,打印可用命令的描述:
提示下一個(gè)輸入:
?命令執(zhí)行后,終端再次顯示提示符(>),等待用戶的下一個(gè)輸入。
重復(fù)一遍:
?循環(huán)繼續(xù),處理用戶輸入的進(jìn)一步命令,調(diào)用適當(dāng)?shù)奶幚沓绦?,并顯示結(jié)果,直到系統(tǒng)關(guān)閉或重置。
本文編譯自hackster.io