FreeModBus解析1
网上对于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相关推荐
- 【STM32】Freemodbus流程解析函数解析详细
此篇博客将按照Freemodbus的运行流程,对各个函数进行解析(无主机RTU模式), 我将尽我所能解释的尽量清楚,如有错误或者语义模糊处还请在评论区指出,谢谢. 运行流程:freemodbus流程 ...
- FreeModbus从站源码解析(portserial.c)
portserial.c #include "port.h" #include "mb.h" #include "mbport.h"#def ...
- FreeModbus从站源码解析(mbfuncholding.c、mbfunccoils.c、mbfuncdisc.c、mbfuncinput.c)
mbfuncholding.c #include "stdlib.h" #include "string.h"#include "port.h&quo ...
- Freemodbus 1.5
源:http://blog.sina.com.cn/s/blog_4935209001012eax.html 网站位置:http://www.freemodbus.org/index.php?lang ...
- uip+freemodbus网络通信
前言: TCP/IP协议通过uip协议栈来实现,应用层的modbus协议使用freemodbus来实现,另外还需要一个网卡(笔者使用的是KSZ8851网卡控制器)来实现底层的数据传输(包括物理层.数据 ...
- 【通信原理】PC上调试MODBUS基本功能(附报文解析)
目录 一 测试环境配置: 二 MODBUS概述: 三 MODBUS测试步骤: 四 MODBUS协议分析: 一 测试环境配置: 本文用到的测试工具如下: (1)Mthings:MThings是一款基于M ...
- 【技术三千问】之《modbus问题难点解析》,避坑指南!
技术三千问: [技术三千问]之<玩转ART-Pi>,看这篇就够了!干货汇总 [技术三千问]之<AT组件问题汇总与解析>,干货汇总! [技术三千问]之<UART串口问题解析 ...
- 10分钟教你玩起来freemodbus
源码获取 本节教程源码资料获取方式: 1.公众号后台回复"modbus" 2.小飞哥gitee仓库自提 3.留言区获取资料链接 freemodbus是什么? 简介及应用场景 Fre ...
- FreeModbus源码详解
本篇按照FreeModbus协议栈的工作流程,对源代码进行总结解析:FreeModbus协议栈作为从机,等待主机传送的数据,当从机接收到一帧完整的报文后,对报文进行解析,然后响应主机,发送报文给主机, ...
最新文章
- GameObject 与gameObject的区别
- Oracle的ha模式启停,数据库oracle 11g 的启停操作
- 大话微服务(Big Talk in MicroService)
- 使用数据增强技术提升模型泛化能力
- 吉麦新能源与联想签订战略合作协议,共同拥抱智能网联汽车升维时代
- js - 让 git 上 Mint-UI 的例子跑起来 - 方法大全
- Oracle中修改存储过程名语句,修改存储过程中使用的语句是,select 语句使用存储过程...
- mysql数据库优化skip_优化配置mysql数据库优化
- git回退到历史版本并提交到远程分支
- 《为学》 [清]彭端淑
- 把苦难装在心里--《赢在中国》(2008-05-27)
- easyswoole数据库连接池_Swoole Redis 连接池的实现
- Linux后台运行python程序
- 中望cad文字显示问号怎么办_CAD钢筋符号显示为问号怎么办?
- Java枚举类 (详细解析java中的枚举类深入浅出)
- 2021全国高校计算机能力挑战赛程序设计赛Python组区域赛(初赛)试题及部分个人解答
- 如何把公共WiFi据为己有,修改别人的路由器WiFi密码,作者只支持技术,不支持后果
- ElasticSearch搜索引擎详解-持续更新中
- 如何在 Windows 环境下配置 PHP 开发运行环境
- linux调试MCX314AL过程