网上对于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 实际上传递的是数组名,是指向指针的指针,此处要注意。

FreeModBus解析1相关推荐

  1. 【STM32】Freemodbus流程解析函数解析详细

     此篇博客将按照Freemodbus的运行流程,对各个函数进行解析(无主机RTU模式), 我将尽我所能解释的尽量清楚,如有错误或者语义模糊处还请在评论区指出,谢谢. 运行流程:freemodbus流程 ...

  2. FreeModbus从站源码解析(portserial.c)

    portserial.c #include "port.h" #include "mb.h" #include "mbport.h"#def ...

  3. FreeModbus从站源码解析(mbfuncholding.c、mbfunccoils.c、mbfuncdisc.c、mbfuncinput.c)

    mbfuncholding.c #include "stdlib.h" #include "string.h"#include "port.h&quo ...

  4. Freemodbus 1.5

    源:http://blog.sina.com.cn/s/blog_4935209001012eax.html 网站位置:http://www.freemodbus.org/index.php?lang ...

  5. uip+freemodbus网络通信

    前言: TCP/IP协议通过uip协议栈来实现,应用层的modbus协议使用freemodbus来实现,另外还需要一个网卡(笔者使用的是KSZ8851网卡控制器)来实现底层的数据传输(包括物理层.数据 ...

  6. 【通信原理】PC上调试MODBUS基本功能(附报文解析)

    目录 一 测试环境配置: 二 MODBUS概述: 三 MODBUS测试步骤: 四 MODBUS协议分析: 一 测试环境配置: 本文用到的测试工具如下: (1)Mthings:MThings是一款基于M ...

  7. 【技术三千问】之《modbus问题难点解析》,避坑指南!

    技术三千问: [技术三千问]之<玩转ART-Pi>,看这篇就够了!干货汇总 [技术三千问]之<AT组件问题汇总与解析>,干货汇总! [技术三千问]之<UART串口问题解析 ...

  8. 10分钟教你玩起来freemodbus

    源码获取 本节教程源码资料获取方式: 1.公众号后台回复"modbus" 2.小飞哥gitee仓库自提 3.留言区获取资料链接 freemodbus是什么? 简介及应用场景 Fre ...

  9. FreeModbus源码详解

    本篇按照FreeModbus协议栈的工作流程,对源代码进行总结解析:FreeModbus协议栈作为从机,等待主机传送的数据,当从机接收到一帧完整的报文后,对报文进行解析,然后响应主机,发送报文给主机, ...

最新文章

  1. GameObject 与gameObject的区别
  2. Oracle的ha模式启停,数据库oracle 11g 的启停操作
  3. 大话微服务(Big Talk in MicroService)
  4. 使用数据增强技术提升模型泛化能力
  5. 吉麦新能源与联想签订战略合作协议,共同拥抱智能网联汽车升维时代
  6. js - 让 git 上 Mint-UI 的例子跑起来 - 方法大全
  7. Oracle中修改存储过程名语句,修改存储过程中使用的语句是,select 语句使用存储过程...
  8. mysql数据库优化skip_优化配置mysql数据库优化
  9. git回退到历史版本并提交到远程分支
  10. 《为学》 [清]彭端淑
  11. 把苦难装在心里--《赢在中国》(2008-05-27)
  12. easyswoole数据库连接池_Swoole Redis 连接池的实现
  13. Linux后台运行python程序
  14. 中望cad文字显示问号怎么办_CAD钢筋符号显示为问号怎么办?
  15. Java枚举类 (详细解析java中的枚举类深入浅出)
  16. 2021全国高校计算机能力挑战赛程序设计赛Python组区域赛(初赛)试题及部分个人解答
  17. 如何把公共WiFi据为己有,修改别人的路由器WiFi密码,作者只支持技术,不支持后果
  18. ElasticSearch搜索引擎详解-持续更新中
  19. 如何在 Windows 环境下配置 PHP 开发运行环境
  20. linux调试MCX314AL过程

热门文章

  1. 利用Python对微信好友数据进行分析
  2. 【Redis学习03】redis缓存及其更新策略
  3. 机器学习 —— 人马图像分类
  4. Ovation系统TC热电偶信号接地指南
  5. 雷神 thunderbook16安装ubuntu18.04后没有网卡
  6. HTML学习笔记--第一天
  7. NVisual-丰富的模型库让可视化管理更简单
  8. 线性回归:损失函数和假设函数
  9. Arduino 串口数据接收并打印输出int类型数据
  10. php断路器,RSM1塑料外壳式断路器