狀態機的方法寫CAN
阿新 • • 發佈:2021-01-06
技術標籤:嵌入式
使用狀態的機的方式寫程式碼,使程式碼更加簡介
1,寫結構體陣列
List_t g_umRxList[RX_NUM] = { /* ID len MsgCycle MsgType RxTxTick RxFunc TxFunc */ {CAN_ID_XX, 8, 0, 0, 0, CanMsg_RxFun, NULL} }; List_t g_umTxList[TX_NUM]= { /* ID len MsgCycle MsgType RxTxTick RxFunc TxFunc */ {CAN_ID_XXX, 8, 100, 0, 0 , NULL, CanMsg_TxFun} };
ID:接收和傳送的ID
Len: 資料的長度
MegCycle: 訊號週期時間
MsgType:CAN傳送的型別
週期型 : 報文以間隔tcycle傳送
事件型 : 滿足觸發條件,實時傳送報文
使能型 : 滿足觸發條件,以週期 tFastCycle 傳送報文
週期事件型 : 報文以週期tcycle傳送, 事件觸發時,在週期中插入事件報文
週期使能型 : 報文以週期時間tcycle傳送,觸發訊號滿足,以快速時間週期tFastCycle傳送.
RxFunc:接收函式
TxFunc: 傳送函式
傳送任務
void CanSchm_TxTask(void) { uint8_t loop; uint8_t u8Db_buf[8]= {0}; List_t *pummsgTx; //table for(loop = 0; loop < TX_MSG_NUM; ++loop) { pummsgTx = g_umTxList[loop]; //陣列名是首地址 if(pummsgTx != NULL) //List not empty { switch (pummsgTx -> enMsgType) { case PERIODIC:// cycle if(( Tick()- (pummsgTx->u32RxTxTick)) >= (pummsgTx->u32MsgCycle)) { pummsgTx->pTxMsgFunc(u8buf); // function if(CAN_RTN_OK == TxFrame(pummsgTx->u32MsgId, u8buf, pummsgTx->u8MsgLen)) { pummsgTx->u32RxTxTick = Tick(); } else { ; } } break; case EVENT: {...} break; case ACTIVE: //tFastCycle A {...} break; case PERIODIC_EVENT: {...} break; case PERIODIC_ACTIVE: {...} break; default :break; }
接收任務
void RxTask(void) { uint8_t loop; List_t *pummsgRx; static uint8_t s_u8rxSucCnt = 0; if(s_u8rxSucCnt != g_umState.RxSucCnt) // if get new nessage { RxFrame(&g_umRxMsg);//receive msg packup for( loop = 0; loop < Num; ++loop ) { pummsgRx = &g_umRxList[loop]; if(pummsgRx != NULL ) { if(g_umRxMsg.u32Id == pummsgRx-> u32MsgId) { if(pummsgRx-> pRxMsgFunc != NULL) //Function { pummsgRx -> pRxMsgFunc(g_umRxMsg); // normal function pummsgRx -> u32RxTxTick = Tick(); s_u8rxSucCnt = g_umState.RxSucCnt; } } } } }