外部模塊通過中斷一次將字符串「CMD \ n」發送給我的程序一個字符。瞭解模塊序列中的哪些位置以便我可以排除故障很重要。這是我目前正在處理模塊跟蹤的方式:如何在C中整潔地處理這種中斷驅動的狀態?
// Enumeration describing the different states
typedef enum {
BTSTATE_ENTERING_CMD_C, // awaiting "C"
BTSTATE_ENTERING_CMD_M,
BTSTATE_ENTERING_CMD_D,
BTSTATE_ENTERING_CMD_EOL,
BTSTATE_CMD
} btstate_t;
// State variable
btstate_t btstate = BTSTATE_ENTERING_CMD_C;
// function called every time a new character is sent
ISR(USART_RX_vect) {
uint8_t rcv = UDR0; // the received character
if ( btstate == BTSTATE_ENTERING_CMD_C && rcv == 'C') {
btstate = BTSTATE_ENTERING_CMD_M;
} else if (btstate == BTSTATE_ENTERING_CMD_M && rcv == 'M') {
btstate = BTSTATE_ENTERING_CMD_D;
} else if (btstate == BTSTATE_ENTERING_CMD_D && rcv == 'D') {
btstate = BTSTATE_ENTERING_CMD_EOL;
} else if (btstate == BTSTATE_ENTERING_CMD_EOL && rcv == '\n') {
btstate = BTSTATE_CMD;
} else {
// error handling here
}
}
直觀上,代碼中似乎有很多冗餘。是否有更好或更經典的方法來達到相同的結果?
您希望在將來如何擴展此功能?你是否想要開始一個除'CMD \ n'之外的多個潛在字符串的路徑,並以一個狀態結束,告訴你輸入了哪個命令? – sh1
@ sh1會有幾條路要走,但程序會知道哪一條路要走。 (這很適合你的解決方案) – Andreas