1. 程式人生 > 其它 >狀態機的方法寫CAN

狀態機的方法寫CAN

技術標籤:嵌入式

使用狀態的機的方式寫程式碼,使程式碼更加簡介

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;
					}
				}
			}
		 }
	 }