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