Ayuda para entender el código.

Iniciado por kondrag_X1, 14 Diciembre 2015, 10:36 AM

0 Miembros y 1 Visitante están viendo este tema.

kondrag_X1

Hola estoy desarrollando una implementación de Modbus master basándome en el estándar de Freemodbus, el cual lo podeis descargar en el siguiente link -> http://www.freemodbus.org/index.php?idx=5

mi pregunta es que hay parte del código que no consigo entender.

me defino un tipo de función con typedef eMBErrorCode etc

/* ----------------------- Prototypes  0-------------------------------------*/
typedef void    ( *pvMBFrameStart ) ( void );

typedef void    ( *pvMBFrameStop ) ( void );

typedef eMBErrorCode( *peMBFrameReceive ) ( UCHAR * pucRcvAddress,
                                           UCHAR ** pucFrame,
                                           USHORT * pusLength );

typedef eMBErrorCode( *peMBFrameSend ) ( UCHAR slaveAddress,
                                        const UCHAR * pucFrame,
                                        USHORT usLength );

typedef void( *pvMBFrameClose ) ( void );



Luego desde la máquina de estados llamo a las funciones:


/* Functions pointer which are initialized in eMBInit( ). Depending on the
* mode (RTU or ASCII) the are set to the correct implementations.
*/
static peMBFrameSend peMBFrameSendCur;
static pvMBFrameStart pvMBFrameStartCur;
static pvMBFrameStop pvMBFrameStopCur;
static peMBFrameReceive peMBFrameReceiveCur;
static pvMBFrameClose pvMBFrameCloseCur;

eMBErrorCode
eMBPoll( void ) {
   static UCHAR   *ucMBFrame;
   static UCHAR    ucRcvAddress;
   static UCHAR    ucFunctionCode;
   static USHORT   usLength;
   static eMBException eException;

   int             i;
   eMBErrorCode    eStatus = MB_ENOERR;
   eMBEventType    eEvent;

   /* Check if the protocol stack is ready. */
   if ( eMBState != STATE_ENABLED ) {
       return MB_EILLSTATE;
   }

   /* Check if there is a event available. If not return control to caller.
    * Otherwise we will handle the event. */
   if ( xMBPortEventGet( &eEvent ) == TRUE ) {
       switch ( eEvent ) {
           case EV_READY:
               break;

           case EV_FRAME_RECEIVED:
               eStatus = peMBFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength );
               if ( eStatus == MB_ENOERR ) {
                   /* Check if the frame is for us. If not ignore the frame. */
                   if ( ( ucRcvAddress == ucMBAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) ) {
                       ( void )xMBPortEventPost( EV_EXECUTE );
                   }
               }
               break;

           case EV_EXECUTE:
               ucFunctionCode = ucMBFrame[MB_PDU_FUNC_OFF];
               eException = MB_EX_ILLEGAL_FUNCTION;
               

               for ( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) {
                   /* No more function handlers registered. Abort. */
                   if ( xFuncHandlers[i].ucFunctionCode == 0 ) {
                       break;
                   } else if ( xFuncHandlers[i].ucFunctionCode == ucFunctionCode ) {
                       eException = xFuncHandlers[i].pxHandler( ucMBFrame, &usLength );
                       break;
                   }
               }

               /* If the request was not sent to the broadcast address we
                * return a reply. */
               if ( ucRcvAddress != MB_ADDRESS_BROADCAST ) {
                   if ( eException != MB_EX_NONE ) {
                       /* An exception occured. Build an error frame. */
                       usLength = 0;
                       ucMBFrame[usLength++] = ( UCHAR )( ucFunctionCode | MB_FUNC_ERROR );
                       ucMBFrame[usLength++] = eException;
                   }
                   eStatus = peMBFrameSendCur( ucMBAddress, ucMBFrame, usLength );
               }
               break;

           case EV_FRAME_SENT:
               break;
       }
   }
   return MB_ENOERR;
}


el problema es que no encuentro la implementación de donde se trata la función peMBFrameSendCur. Alguien sabe como está estructurado el código?