libmodbus源码分析(2)主机(客户端)功能源码分析

2023-10-10 05:40

本文主要是介绍libmodbus源码分析(2)主机(客户端)功能源码分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一篇文章《 libmodbus 源码分析(1)基本框架、关键数据结构、接口 》中,分析了libmodbus的源码基本框架和关键的数据结构、接口,本文就分析一下 libmodbus 作为 主机(客户端)的功能源码实现,这里我们以 modbus rtu 协议 的读 4x 区保持寄存器功能 进行举例说明,

我们简单的写一下 modbus rtu 下读 4x 区保持寄存器的 伪代码 流程:

int main()
{modbus_t *ctx = NULL;uint16_t tab_rp_register[200];  // 不一定是200个,根据自己的需要来定义/* 创建并初始化 modbus_t 指针 */ctx = modbus_new_rtu("/dev/ttyUSB1", 115200, 'N', 8, 1);/* 设置 错误 恢复模式 */modbus_set_error_recovery(ctx,MODBUS_ERROR_RECOVERY_LINK |MODBUS_ERROR_RECOVERY_PROTOCOL);/* 设置 从机 (服务器) 地址, 支持运行中 设定,也就是可以 实现多从机的轮询 */modbus_set_slave(ctx, SERVER_ID);/* 与从机建立连接 */modbus_connect(ctx);/* 4x区保持寄存器 的读 功能, 从 地址 start_addr开始,共读 nb 个寄存器 * 读到的寄存器值存放到 tab_rp_registers 中*/modbus_read_registers(ctx, start_addr, nb, tab_rp_registers);/* 关闭 modbus */modbus_close( ctx );/* 释放 modbus 资源 */modbus_free( ctx );
}

 上面的伪代码是 是读1次的实现,如果想要对不同的从设备进行轮询,我们只需要在while(1)循环中 先设定 从设备地址,然后再 调用 modbus_read_registers即可。

   上面的代码中,大部分的接口函数都是比较容易理解,只有 modbus_read_registers 相对复杂一些,因为它实现的功能也比较多,分别为:

 ① 创建并打包 读命令。

 ② 发送 步骤①中的读指令。

 ③ 接收从机返回数据,分三次接收数据,先接收前2个字节(功能),再接收 第3个字节(数据长度),再接收剩下的字节数。

     选择3次进行接收,一方面是为了随时校验,在linux下接收不定长数据的实现不太方便,所以根据modbus协议框架,先接收 到总数据长度,然后就能按照指定长度进行接收。

 ④ 对返回数据 进行各种校验,比如设备地址,地址、数量、CRC校验等。

 ⑤ 将正确的返回 有效数据 存放到 我们指定的 缓存中。

 接下来就通过层层的调用关系来分析该代码功能,如下图所示:

 其他的 modbus_read_xxx和write功能代码实现与上面的类似。

这篇关于libmodbus源码分析(2)主机(客户端)功能源码分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/178347

相关文章

Springboot请求和响应相关注解及使用场景分析

《Springboot请求和响应相关注解及使用场景分析》本文介绍了SpringBoot中用于处理HTTP请求和构建HTTP响应的常用注解,包括@RequestMapping、@RequestParam... 目录1. 请求处理注解@RequestMapping@GetMapping, @PostMappin

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

Java多种文件复制方式以及效率对比分析

《Java多种文件复制方式以及效率对比分析》本文总结了Java复制文件的多种方式,包括传统的字节流、字符流、NIO系列、第三方包中的FileUtils等,并提供了不同方式的效率比较,同时,还介绍了遍历... 目录1 背景2 概述3 遍历3.1listFiles()3.2list()3.3org.codeha

Python实现繁体转简体功能的三种方案

《Python实现繁体转简体功能的三种方案》在中文信息处理中,繁体字与简体字的转换是一个常见需求,无论是处理港澳台地区的文本数据,还是开发面向不同中文用户群体的应用,繁简转换都是不可或缺的功能,本文将... 目录前言为什么需要繁简转换?python实现方案方案一:使用opencc库方案二:使用zhconv库