點擊下方名片,關注公眾號,獲取更多精彩內容▼

歡迎關注【玩轉單片機與嵌入式】公眾號,回復關鍵字獲取更多免費視頻和資料
回復【加群】,【單片機】、【STM32】、【硬件知識】、【硬件設計】、【經典電路】、【論文】、【畢業設計】、【3D封裝庫】、【PCB】、【電容】、【TVS】、【阻抗匹配】、【資料】、【終端電阻】、【Keil】、【485】、【CAN】、【振蕩器】、[USBCAN]、【PCB】、【智能手環】、【智能家居】、【智能小車】、【555】、【I2C】、【華為】、【中興】,等……
在嵌入式系統開發中,命令解析是一個關鍵的環節,它負責解析用戶或其他系統發送的命令,并執行相應的操作。傳統的命令解析方法通常采用switch case語句,這種方式雖然經典,但在功能擴展和代碼維護上存在一些不足。下面小編為大家推薦一種更為靈活和模塊化的命令解析方法,即通過回調函數實現功能碼的動態綁定,提高系統的可維護性和可擴展性。

傳統方法的缺陷

在傳統的命令解析中,如下圖所示的協議內容:

void poll_task(rt_uint8_t cmd, rt_uint8_t *msg, uint8_t len){switch (cmd){case cmd1:func1();break;case cmd2:func2();break;case cmd3:func3();break;case cmd4:func4();break;default:default_func();break;}}
這樣的寫法存在一個明顯的問題,即在增加新的功能碼時需要修改poll_task函數,不夠靈活。而且,若要統計功能碼的個數,只能手動數,不夠智能。

創新的回調函數應用

typedef struct{rt_uint8_t CMD;rt_uint8_t (*callback_func)(rt_uint8_t cmd, rt_uint8_t *msg, uint8_t len);} _FUNCCALLBACK;_FUNCCALLBACK callback_list[] ={{cmd1, func_callback1},{cmd2, func_callback2},{cmd3, func_callback3},{cmd4, func_callback4},// 添加新的功能碼和回調函數只需在這里新增};void poll_task(rt_uint8_t cmd, rt_uint8_t *msg, uint8_t len){int cmd_indexmax = sizeof(callback_list) / sizeof(_FUNCCALLBACK);int cmd_index = 0;for (cmd_index = 0; cmd_index < cmd_indexmax; cmd_index++){if (callback_list[cmd_index].CMD == cmd){if(callback_list[cmd_index].callback_func){// 處理邏輯callback_list[cmd_index].callback_func(cmd, msg, len);}}}}

進一步優化

// 將命令解析放入隊列的偽代碼void command_queue_handler(void){// 從隊列中獲取命令rt_uint8_t cmd = get_command_from_queue();rt_uint8_t msg[MAX_MESSAGE_SIZE];rt_uint8_t len = get_message_length();// 調用命令解析函數poll_task(cmd, msg, len);}
E?N?D
歡迎關注我的公眾號,回復【加群】或掃碼加我好友,限時免費進入技術交流群,也可免費加入我的知識星球。
推薦閱讀
【專輯】器件選型
【專輯】單片機
【專輯】經驗分享
【專輯】STM32
【專輯】硬件設計
【專輯】軟件設計
【專輯】開源項目
【專輯】職業發展
感謝大家閱讀,如果喜歡
請點贊和“在看”吧,或者分享到朋友圈。
點擊跳轉到原文,限時優惠加入我們的知識星球(加好友獲取免費券)