回覆列表
-
1 # lehoon
-
2 # 超脫眾品化育群生
一百多個條件應該不是平級的吧?分個層唄,機率大的靠前一些。另外執行程式碼類似的可以做個複用的宏函式,總體上我來做應該是先分類後歸類
-
3 # 三輪新司機
使用狀態機是個好辦法,將通訊協議的接收流程分成多個狀態,在每個狀態裡只處理有限的幾種接收情況,根據接收到的情況設定下一次的狀態。
-
4 # 迷途不行
兩種情況啊
1.指令之間有明顯分隔符的,那麼收到分隔符,將接收的緩衝區進行解析,然後直接清空緩衝區
2.如果沒有明顯分隔符,那麼就每一次收到資料就嘗試解析,清除解析成功的資料,留下未解析的資料(可能是半包資料)
對於解析訊息,可以直接sscanf函式搞定 自己百度一下
-
5 # 程式bug一樣的存在
類似中斷呼叫即可!
d語言的程式碼演示
alias funx=void function();
funx[127] cmds = [&case1,...];
void test(){
auto c = readbuf();
cmds[c & 127]();
}
-
6 # Ren
主要得看協議是怎麼定製的,使用簡單快速的方法判定:其他節點的包、沒有接收完成的包、接收完成的包、校驗錯誤的包、傳輸超時的包、匯流排干擾產生的偶然字元等等狀態,根據不同的狀態做出處理,接收完成的包儘快轉存後解包,儘可能少進入實質解包的過程。曾經看到過有同學用強制解包的方法判斷包的可用性,如果是算力比較差的51之類的微控制器,非累死不可。
-
7 # ScholarMartin
想辦法把這一百多個case值對映到一個小範圍,switch在編譯時會最佳化為查表分支。
值的分佈範圍影響散轉表的大小。
使用函式指標陣列,減少if,switch case使用,而且梳理好邏輯,提高程式碼的可讀性。
用法如下:
typedef enum {
E_IDLE = 0,
E_SYNC,
E_DETECT_FAULT,
E_FEEDBACK_FAULT
} Enum_State;
static Enum_State eState = E_IDLE;
static void APP_Idle(void); /* 省略了函式具體實現的功能 */
static void APP_Sync(void);
static void APP_DetectLedFault(void);
static void APP_FeedbackFault(void);
void (*APP_Operation[])(void) = { /* Sequence must be consistent with EnumState */
APP_Idle,
APP_Sync,
APP_DetectLedFault,
APP_FeedbackFault
};
void main(void)
{
for(;;)
{
APP_Operation[eState]();
}
}