做一个好的接口函数

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

#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);
}
时间: 2024-12-15 14:08:14

做一个好的接口函数的相关文章

如何做一个简单的开放接口(1)-功能设计

1.缘起 最初,系统系统间都是孤立的.业务是贯穿的,系统间也必然需要交互数据. 实现数据交互的方式有好多种,可以通过ftp交互Excel文件,可以通过互相读写的中间库,可以通过Web Services. 系统间可能是点对点交互,可能是一对多广播,可能是多对一汇总,可能是多对多协同. 在复杂IT场景中,多信息系统各司其职,协作完成工作.交互数据的事情怎样做呢? 数据交互有两个核心问题要解决:一是协议,二是数据格式.这两个都需要通信双方协商. 如果是企业内部的各信息系统,可以搭建统一的数据交互平台解

一个无锁消息队列引发的血案:怎样做一个真正的程序员?(二)——月:自旋锁

前续 一个无锁消息队列引发的血案:怎样做一个真正的程序员?(一)——地:起因 一个无锁消息队列引发的血案:怎样做一个真正的程序员?(二)——月:自旋锁 平行时空 在复制好上面那一行我就先停下来了,算是先占了个位置,虽然我知道大概要怎么写,不过感觉还是很乱. 我突然想到,既然那么纠结,那么混乱,那么不知所措,我们不如换个视角.记得高中时看过的为数不多的长篇小说<穆斯林的葬礼>,作者是:霍达(女),故事描写了两个发生在不同时代.有着不同的内容却又交错扭结的爱情悲剧,一个是“玉”的故事,一个是“月”

COM接口函数通用Hook方法

本文是我的本科学位论文, 今发表在此, 以示原创之据 第1章 绪论 研究背景 研究意义 相关技术简介 COM概述 COM内存模型描述及C语言和C++语言实现 调用约定 Hook API原理 Windows钩子原理及进程注入 开发及调试环境 第2章 问题抽象及关键技术研究 实验01:通过调试器查看C++类的虚函数表 实验02:通过函数指针调用C++虚函数 实验03:交换两个相同C++类的虚函数表 实验04-1:替换C++虚函数表中的虚函数(__thiscall)地址 实验04-2:替换C++虚函数

做一个群组聊天页面

要做个群组聊天的页面,参考微信的web版本,大致就是分为左右两列,左边是群组列表,右边是群组中的对话 示例图如下: 这个页面风格是使用ACE做的,再次啧啧下,ACE真TMD强大,这个页面的风格很招人喜欢. 做这个页面刚开始的时候我走了弯路,初步想的是使用iframe,左侧群组聊天页面是页面加载的,右侧的群组对话框是个iframe.然后点击左侧的任意一个群组,右侧的对话iframe就修改src,然后更新对话的时候也超简单,直接iframe重新加载一下就ok了. 但是呢,后来发现,我这样需要写的co

做一个具有图片读入,写出,灰度化,黑白化的有图形界面的小软件

我们这一次的树莓基础的作业是做一个做一个具有图片读入,写出,灰度化,黑白化的小软件,我采用的是java,因为java有大量性能非常好的接口可用,譬如在图片这块,ImageIO,BufferedImage都是非常好用的,而我这一次作业也是使用这两个包. 首先我们要解决的是界面,界面可以直接用JFrame来打, 非常简单,我的界面有一个菜单栏和一个图片显示区,菜单栏有三个选项:文件,转换,保存,文件菜单有一个子菜单:打开文件,转换菜单有两个子菜单:变成灰度和变成黑白,保存菜单有三个子菜单:jpg,

Oracle官网JNI简介和接口函数分析

第一章 概述 本章主要介绍JNI(Java Native Interface),JNI是一种本地编程接口.它允许运行在JAVA虚拟机中的JAVA代码和用其他编程语言,诸如C语言.C++.汇编,写的应用和库之间的交互操作. JNI的最大优势在于没有强加任何限制在JAVA虚拟机的下层实现上,因此,JAVA虚拟机供应商能够提供JNI的支持而不影响虚拟机的其他部分,程序员只需写出一个版本的本地应用和库,就可使之运行在一切支持JNI的JAVA虚拟机上. 本章包含了以下的要点: ? JNI概述 ? 目标 ?

FreeSWITCH折腾笔记4——自己做一个TTS服务器

freeswitch原生支持的tts功能中文一般是使用的ekho,但是那合成的效果简直惨不忍睹,于是我想自己做一个TTS服务器. 首先是找到比较满意的TTS引擎,科大讯飞的效果当然是没话说,但是价格不菲,其他商业的引擎中文合成也不是很流畅,偶然发现windows7自带的合成引擎还算过得去,windows10带的合成引擎就更好了(有兴趣的可以先测试一下,直接在windows控制面板中的语音设置里面有测试,但是测试的中英文混读很蛋疼). 那么问题来了,怎么把这个引擎用到我的FS上边呢? 思路,deb

【小松教你手游开发】【系统模块开发】做一个3d旋转菜单

在unity做一个3d旋转菜单,像乱斗西游2的这种: 暂时有两种方法可以实现: 一.当做是2d界面,通过定义几个固定点的坐标.大小.透明度,还有每个点的panel depth大小,把数据存储下来,在手机滑动的过程中计算滑动划过的距离和这个panel大小的比值,乘以两个点之间的距离,获得坐标点移动的距离,通过改变x轴改变位置,同理改变大小和透明度. 这个方法我自己做2d游戏的时候实现过,做起来比较简单,没有什么可拓展性可言,并且会有很多限制,比如拖动过程中很难转变方向.要自己实现运动中的弹性(这里

使用Windows GDI 做一个3D”软引擎“-Part1

前: 最近几天一个很虎比的教程吸引了我的视线,原作者使用c# / JavaScript逐步实现了一个基本的3D软引擎. 我不懂上面提到的语言,所以,准备用我熟悉的C++和Win32实现重造这个轮子.:) 注意: 这不是一篇关于DirectX / OpenGL (GPU)的文章,本系列文章将实现一个软件(CPU)驱动的“DirectX”,很有趣吧,啊哈. 本文假设读者有一定的计算机图形学的基础,使用OpenGL / DirectX 写过程序. 本文假设读者有一定的Win32基础(不是MFC),最起