FreeModBus解析1

網上對於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 實際上傳遞的是數組名,是指向指針的指針,此處要注意。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章