码迷,mamicode.com
首页 > 其他好文 > 详细

做一个好的接口函数

时间:2017-08-19 12:41:12      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:epo   data   unsigned   gre   single   erro   gateway   bsp   write   

    定义一群接口一样的函数,使用联合体结构体函数指针;

    

#include "stdio.h"

typedef unsigned          char u8;
typedef unsigned short     int u16;
typedef unsigned           int u32;
 
#define  MB_FUNC_HANDLERS_MAX      17  

#define MB_ADDRESS_BROADCAST    ( 0 ) 
#define MB_ADDRESS_MIN          ( 1 )
#define MB_ADDRESS_MAX          ( 7 ) 

#define MB_FUNC_NONE                          (  0 )
#define MB_FUNC_READ_COILS                    (  1 )
#define MB_FUNC_READ_DISCRETE_INPUTS          (  2 )
#define MB_FUNC_WRITE_SINGLE_COIL             (  5 )
#define MB_FUNC_WRITE_MULTIPLE_COILS          ( 15 )
#define MB_FUNC_READ_HOLDING_REGISTER         (  3 )
#define MB_FUNC_READ_INPUT_REGISTER           (  4 )
#define MB_FUNC_WRITE_REGISTER                (  6 )
#define MB_FUNC_WRITE_MULTIPLE_REGISTERS      ( 16 )
#define MB_FUNC_READWRITE_MULTIPLE_REGISTERS  ( 23 )
#define MB_FUNC_DIAG_READ_EXCEPTION           (  7 )
#define MB_FUNC_DIAG_DIAGNOSTIC               (  8 )
#define MB_FUNC_DIAG_GET_COM_EVENT_CNT        ( 11 )
#define MB_FUNC_DIAG_GET_COM_EVENT_LOG        ( 12 )
#define MB_FUNC_OTHER_REPORT_SLAVEI

                   
typedef enum
{
    MB_EX_NONE                 = 0x00,
    MB_EX_ILLEGAL_FUNCTION     = 0x01,
    MB_EX_ILLEGAL_DATA_ADDRESS = 0x02,
    MB_EX_ILLEGAL_DATA_VALUE   = 0x03,
    MB_EX_SLAVE_DEVICE_FAILURE = 0x04,
    MB_EX_ACKNOWLEDGE          = 0x05,
    MB_EX_SLAVE_BUSY           = 0x06,
    MB_EX_MEMORY_PARITY_ERROR  = 0x08,
    MB_EX_GATEWAY_PATH_FAILED  = 0x0A,
    MB_EX_GATEWAY_TGT_FAILED   = 0x0B
}ENUM_MB_EXCEPTION;//1  返回类型定义

typedef struct
{
    u8               ucFunctionCode;
    ENUM_MB_EXCEPTION   (*pxHandler)( u8 * , u16 * );
} STRU_MB_FUNCTION_HANDLER;

static STRU_MB_FUNCTION_HANDLER * gpstruMbFunHandler;

ENUM_MB_EXCEPTION 
MB_FuncReadCoils( u8 *pucPduFrame, u16 * pusLength )
{
    ENUM_MB_EXCEPTION enStatus = MB_EX_NONE;
    printf("Sl = %d   comm = %d   Led = %d \n",pucPduFrame[0],pucPduFrame[1],*pusLength);
        return enStatus;
}

ENUM_MB_EXCEPTION 
MB_FuncReadHoldingRegister( u8 *pucPduFrame, u16 * pusLength )
{
    ENUM_MB_EXCEPTION enStatus = MB_EX_NONE;
    printf("Sl = %d   comm = %d   Led = %d \n",pucPduFrame[0],pucPduFrame[1],*pusLength);
        return enStatus;
}

ENUM_MB_EXCEPTION 
MB_FuncWriteSingleCoil( u8 *pucPduFrame, u16 * pusLength )
{
    ENUM_MB_EXCEPTION enStatus = MB_EX_NONE;
    printf("Sl = %d   comm = %d   Led = %d \n",pucPduFrame[0],pucPduFrame[1],*pusLength);
        return enStatus;
}

ENUM_MB_EXCEPTION 
MB_FuncWriteHoldingRegister( u8 *pucPduFrame, u16 * pusLength )
{
    ENUM_MB_EXCEPTION enStatus = MB_EX_NONE;
    printf("Sl = %d   comm = %d   Led = %d \n",pucPduFrame[0],pucPduFrame[1],*pusLength);
        return enStatus;
}

ENUM_MB_EXCEPTION 
MB_FuncWriteMultipleCoils( u8 *pucPduFrame, u16 * pusLength )
{
    ENUM_MB_EXCEPTION enStatus = MB_EX_NONE;
    printf("Sl = %d   comm = %d   Led = %d \n",pucPduFrame[0],pucPduFrame[1],*pusLength);
        return enStatus;
}

ENUM_MB_EXCEPTION 
MB_FuncWriteMultipleHoldingRegister( u8 *pucPduFrame, u16 * pusLength )
{
    ENUM_MB_EXCEPTION enStatus = MB_EX_NONE;

    printf("Sl = %d   comm = %d   Led = %d \n",pucPduFrame[0],pucPduFrame[1],*pusLength);
        return enStatus;
}
ENUM_MB_EXCEPTION 
MB_Func0( u8 *pucPduFrame, u16 * pusLength )
{
    ENUM_MB_EXCEPTION enStatus = MB_EX_NONE;

    printf("Sl = %d   comm = %d   Led = %d \n",pucPduFrame[0],pucPduFrame[1],*pusLength);
        return enStatus;
}
static STRU_MB_FUNCTION_HANDLER gastruRtuFuncHandlers[MB_FUNC_HANDLERS_MAX] =
{
/* 0  */        {MB_FUNC_NONE,                      MB_Func0},
/* 1  */        {MB_FUNC_READ_COILS,                MB_FuncReadCoils},
/* 2  */        {MB_FUNC_READ_DISCRETE_INPUTS,      MB_FuncReadCoils},
/* 3  */        {MB_FUNC_READ_HOLDING_REGISTER,     MB_FuncReadHoldingRegister},
/* 4  */        {MB_FUNC_READ_INPUT_REGISTER,       MB_Func0},
/* 5  */        {MB_FUNC_WRITE_SINGLE_COIL,         MB_FuncWriteSingleCoil},
/* 6  */        {MB_FUNC_WRITE_REGISTER,            MB_FuncWriteHoldingRegister},
/* 7  */        {MB_FUNC_DIAG_READ_EXCEPTION,       MB_Func0},
/* 8  */        {MB_FUNC_DIAG_DIAGNOSTIC,           MB_Func0},
/* 9  */        {MB_FUNC_NONE,                      MB_Func0},
/* 10 */        {MB_FUNC_NONE,                      MB_Func0},
/* 11 */        {MB_FUNC_DIAG_GET_COM_EVENT_CNT,    MB_Func0},
/* 12 */        {MB_FUNC_DIAG_GET_COM_EVENT_LOG,    MB_Func0},
/* 13 */        {MB_FUNC_NONE,                      MB_Func0},
/* 14 */        {MB_FUNC_NONE,                      MB_Func0},
/* 15 */        {MB_FUNC_WRITE_MULTIPLE_COILS,      MB_FuncWriteMultipleCoils},
/* 16 */        {MB_FUNC_WRITE_MULTIPLE_REGISTERS,  MB_FuncWriteMultipleHoldingRegister}
};


int main(void)
{    
    u8 i;                                     
    u16 usLen = 55;
    u8 puiFrame[10] = {0x01,0x03,0x00,0x1A,0x00,0x04,0x65,0xCE};
    ENUM_MB_EXCEPTION enException;        
    for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ )
    {
        enException = gastruRtuFuncHandlers[i].pxHandler( puiFrame, &usLen );
    }
    while(1);
}

 

    

做一个好的接口函数

标签:epo   data   unsigned   gre   single   erro   gateway   bsp   write   

原文地址:http://www.cnblogs.com/luckytimor/p/7395858.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!