做一个好的接口函数

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

    

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

 

    

转载于:https://www.cnblogs.com/luckytimor/p/7395858.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值