網上對於FreeModBus的解析有很多,我也是參照這些解析多少讀懂了FreeModBus。FreeModBus在千頭萬緒,這裏,我撿其中的一條線索,就其中一個函數的調用,理清一下,學到不少東西。
對比下面兩個函數:
peMBFrameReceiveCur 與 eMBRTUReceive
看看它們是怎麼定義,怎麼調用。
下面是第一個函數的聲明:
typedef eMBErrorCode( *peMBFrameReceive )( UCHAR * pucRcvAddress,
UCHAR ** pucFrame,
USHORT * pusLength );
static peMBFrameReceive peMBFrameReceiveCur;
第二個函數的聲明:
eMBErrorCode eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength);
選擇RTU模式時,前者鉤住後者:
peMBFrameReceiveCur = eMBRTUReceive;
在狀態機 eMBPoll 中,當時間投遞爲 EV_FRAME_RECEIVED 時,執行函數
eStatus = peMBFrameReceiveCur( & ucRcvAddress, & ucMBFrame, & usLength );
三個參數在狀態機 eMBPoll 中的定義爲:
static UCHAR ucRcvAddress;
static UCHAR *ucMBFrame;
static USHORT usLength;
這個例子可以學到:
1,這不知道該叫回調函數,還是鉤子函數,反正我現在的理解是,peMBFrameReceiveCur可已在不同的ModBus模式下鉤住不同的函數,在合適的條件下執行這些不同的函數。這樣的好處之一是,調用者和被調用者分開,調用者在合適的條件下可以調用其他的被調用者。
2,最後看這個函數的調用,這裏是典型的指針傳遞,函數調用時同時把ucRcvAddress,*ucMBFrame,usLength,這三個參數的地址傳遞給回調函數,回調函數執行完成後,這三個參數的值改變,即得到了這一幀數據的地址,長度以及數據內容。
問題:
1,鉤子函數和回調函數的區別
2,被調用者是回調函數,我理解的沒錯吧
3,在用指針傳遞的函數聲明裏
eMBErrorCode eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength);
參數UCHAR ** pucFrame 實際上傳遞的是數組名,是指向指針的指針,此處要注意。