00. 目录

文章目录

  • 00. 目录
  • 01. modbus常用接口函数概述
  • 02. modbus辅助接口函数
  • 03. modbus功能接口函数
  • 04. modbus数据处理
  • 05. 附录

01. modbus常用接口函数概述

libmodbus开发库提供的所有接口API函数,其主要对象文件包括modbus.hmodbus.c,接口函数大致可以分为3类。

02. modbus辅助接口函数

modbus.c文件中辅助接口函数

//设置从站地址
MODBUS_API int modbus_set_slave(modbus_t* ctx, int slave);
//获取从站地址
MODBUS_API int modbus_get_slave(modbus_t* ctx);
//设置错误恢复模式
MODBUS_API int modbus_set_error_recovery(modbus_t *ctx, modbus_error_recovery_mode error_recovery);
//设置当前socket或者串口句柄
MODBUS_API int modbus_set_socket(modbus_t *ctx, int s);
//获取当前socket或者窗口句柄
MODBUS_API int modbus_get_socket(modbus_t *ctx);//获取响应超时
MODBUS_API int modbus_get_response_timeout(modbus_t *ctx, uint32_t *to_sec, uint32_t *to_usec);
//设置响应超时
MODBUS_API int modbus_set_response_timeout(modbus_t *ctx, uint32_t to_sec, uint32_t to_usec);
//获取连续字节之间的超时时间
MODBUS_API int modbus_get_byte_timeout(modbus_t *ctx, uint32_t *to_sec, uint32_t *to_usec);
//设置连续字节之间的超时时间
MODBUS_API int modbus_set_byte_timeout(modbus_t *ctx, uint32_t to_sec, uint32_t to_usec);//获取服务端等待客户端请求超时时间
MODBUS_API int modbus_get_indication_timeout(modbus_t *ctx, uint32_t *to_sec, uint32_t *to_usec);
//设置服务端等待客户端请求超时时间
MODBUS_API int modbus_set_indication_timeout(modbus_t *ctx, uint32_t to_sec, uint32_t to_usec);
//获取报文头长度
MODBUS_API int modbus_get_header_length(modbus_t *ctx);
//用于主站设备与从站设备建立连接
MODBUS_API int modbus_connect(modbus_t *ctx);
//关闭连接
MODBUS_API void modbus_close(modbus_t *ctx);
//释放内存
MODBUS_API void modbus_free(modbus_t *ctx);
//刷新缓冲区
MODBUS_API int modbus_flush(modbus_t *ctx);
//是否设置为debug模式
MODBUS_API int modbus_set_debug(modbus_t *ctx, int flag);
//获取当前错误信息
MODBUS_API const char *modbus_strerror(int errnum);

03. modbus功能接口函数

modbus.c文件中功能接口函数

//读取线圈或者离散量输出状态(功能码 0x1)
MODBUS_API int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
//读取离散量输入值(功能码 0x2)
MODBUS_API int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
//读取保持寄存器(功能码 0x3)
MODBUS_API int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
//读取输入寄存器(功能码 0x4)
MODBUS_API int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
//写单个线圈或者单个离散量(功能码 0x5)
MODBUS_API int modbus_write_bit(modbus_t *ctx, int coil_addr, int status);
//写单个保持寄存器(功能码 0x6)
MODBUS_API int modbus_write_register(modbus_t *ctx, int reg_addr, const uint16_t value);
//写多个线圈(功能码 0xF)
MODBUS_API int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *data);
//写多个保持寄存器(功能码 0x10)
MODBUS_API int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *data);
MODBUS_API int modbus_mask_write_register(modbus_t *ctx, int addr, uint16_t and_mask, uint16_t or_mask);
MODBUS_API int modbus_write_and_read_registers(modbus_t *ctx, int write_addr, int write_nb,const uint16_t *src, int read_addr, int read_nb,uint16_t *dest);
//报告从站ID(功能码 0x11)
MODBUS_API int modbus_report_slave_id(modbus_t *ctx, int max_dest, uint8_t *dest);

04. modbus数据处理

在libmodbus开发库中,为了方便数据处理,在modbus.h文件中定义了一系列数据处理宏。

/*** UTILS FUNCTIONS**/
//获取高字节
#define MODBUS_GET_HIGH_BYTE(data) (((data) >> 8) & 0xFF)
//获取低字节
#define MODBUS_GET_LOW_BYTE(data) ((data) & 0xFF)
#define MODBUS_GET_INT64_FROM_INT16(tab_int16, index) \(((int64_t)tab_int16[(index)    ] << 48) | \((int64_t)tab_int16[(index) + 1] << 32) | \((int64_t)tab_int16[(index) + 2] << 16) | \(int64_t)tab_int16[(index) + 3])
#define MODBUS_GET_INT32_FROM_INT16(tab_int16, index) \(((int32_t)tab_int16[(index)    ] << 16) | \(int32_t)tab_int16[(index) + 1])
#define MODBUS_GET_INT16_FROM_INT8(tab_int8, index) \(((int16_t)tab_int8[(index)    ] << 8) | \(int16_t)tab_int8[(index) + 1])
#define MODBUS_SET_INT16_TO_INT8(tab_int8, index, value) \do { \((int8_t*)(tab_int8))[(index)    ] = (int8_t)((value) >> 8);  \((int8_t*)(tab_int8))[(index) + 1] = (int8_t)(value); \} while (0)
#define MODBUS_SET_INT32_TO_INT16(tab_int16, index, value) \do { \((int16_t*)(tab_int16))[(index)    ] = (int16_t)((value) >> 16); \((int16_t*)(tab_int16))[(index) + 1] = (int16_t)(value); \} while (0)
#define MODBUS_SET_INT64_TO_INT16(tab_int16, index, value) \do { \((int16_t*)(tab_int16))[(index)    ] = (int16_t)((value) >> 48); \((int16_t*)(tab_int16))[(index) + 1] = (int16_t)((value) >> 32); \((int16_t*)(tab_int16))[(index) + 2] = (int16_t)((value) >> 16); \((int16_t*)(tab_int16))[(index) + 3] = (int16_t)(value); \} while (0)

对于浮点数等多字节数据而言,由于存在字节序和大小端处理等问题,所有辅助定义了一些特殊函数


MODBUS_API void modbus_set_bits_from_byte(uint8_t *dest, int idx, const uint8_t value);
MODBUS_API void modbus_set_bits_from_bytes(uint8_t *dest, int idx, unsigned int nb_bits,const uint8_t *tab_byte);
MODBUS_API uint8_t modbus_get_byte_from_bits(const uint8_t *src, int idx, unsigned int nb_bits);
MODBUS_API float modbus_get_float(const uint16_t *src);
MODBUS_API float modbus_get_float_abcd(const uint16_t *src);
MODBUS_API float modbus_get_float_dcba(const uint16_t *src);
MODBUS_API float modbus_get_float_badc(const uint16_t *src);
MODBUS_API float modbus_get_float_cdab(const uint16_t *src);MODBUS_API void modbus_set_float(float f, uint16_t *dest);
MODBUS_API void modbus_set_float_abcd(float f, uint16_t *dest);
MODBUS_API void modbus_set_float_dcba(float f, uint16_t *dest);
MODBUS_API void modbus_set_float_badc(float f, uint16_t *dest);
MODBUS_API void modbus_set_float_cdab(float f, uint16_t *dest);

05. 附录

libmodbus源码下载:https://github.com/stephane/libmodbus

【嵌入式】Libmodbus源码分析(二)-常用接口函数分析相关推荐

  1. nginx源码阅读(二).初始化:main函数及ngx_init_cycle函数

    前言 在分析源码时,我们可以先把握主干,然后其他部分再挨个分析就行了.接下来我们先看看nginx的main函数干了些什么. main函数 这里先介绍一些下面会遇到的变量类型: ngx_int_t: t ...

  2. 【嵌入式】Libmodbus源码分析(一)-类型和结构体

    00. 目录 文章目录 00. 目录 01. 常见类型声明 02. 常量声明 03. _modbus结构体声明 04. modbus_backend_t结构体声明 05. modbus_mapping ...

  3. 一点一点看JDK源码(二)java.util.List

    一点一点看JDK源码(二)java.util.List liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 List译为表,一览表, ...

  4. 分析开源项目源码,我们该如何入手分析?(授人以渔)

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 1 前言 本文接上篇文章跟大家聊聊我们为什么 ...

  5. mybatis源码阅读(二):mybatis初始化上

    转载自  mybatis源码阅读(二):mybatis初始化上 1.初始化入口 //Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与 ...

  6. 小程序源码:修复登录接口版最新知识付费变现小程序源码下载-独立后台版本

    这个小程序是干什么的? 资源分享小程序为网络资源分享类自媒体解决变现与传播问题,小小的资源,要钱不合适,不要钱又不能用爰发电,让用户分享又没有效果,那么我们就可以让用户打开小程序,看一段广告,直接获取 ...

  7. mybatis源码考究二(sqlsession线程安全和缓存失效)

    mybatis源码考究二 1.mybatis整合spring解决sqlsession线程安全问题 2.mybatis整合spring一级缓存失效问题 mybatis结合spring使用 1.项目依赖 ...

  8. 带你快速入门AXI4总线--AXI4-Full篇(3)----XILINX AXI4-Full接口IP源码仿真分析(Master接口)

    写在前面 接slave接口篇,本文继续打包一个AXI4-Full-Master接口的IP,学习下源码,再仿真看看波形. 带你快速入门AXI4总线--AXI4-Full篇(2)----XILINX AX ...

  9. LambdaMART简介——基于Ranklib源码(二 Regression Tree训练)

     LambdaMART简介--基于Ranklib源码(二 Regression Tree训练) 上一节中介绍了 λ λ 的计算,lambdaMART就以计算的每个doc的 λ λ 值作为label ...

最新文章

  1. java连接字符串_Java字符串连接运算符
  2. cmd - 命令行窗口中文乱码
  3. 两组回归系数差异检验_【stata系列】——组间系数差异检验
  4. careercup-数组和字符串1.7
  5. vb趣味编程弹球小游戏_最好玩的微信小游戏集合,总有一款是你没玩过的
  6. NDK-r14b + FFmpeg-release-3.4 linux下编译FFmpeg
  7. java虚拟机内存模型种类_深入理解volatile类型——从Java虚拟机内存模型角度
  8. 利用类定义一个指针会调用默认构造函数吗_C++的拷贝构造函数
  9. Druid 介绍及配置
  10. 【机器学习】监督学习--(分类)决策树②
  11. chmod和chown命令的用法
  12. atitit.印度教与java宗教的特点与观念对比 attilax总结
  13. Cisco Packet Tracer Student思科命令
  14. eclipse中pom文件的查看
  15. 硬盘sata供电不启动,必须用大4pin转sata的情况
  16. 《我爱我的祖国》受捧 再现专线另类舌尖上中国
  17. 移动地盘仿真平台搭建
  18. java编程:对两个分数进行简单的算术运算
  19. C语言的s8数据结构
  20. 百度之星资格赛1003 度度熊与邪恶大魔王(dp)--2017

热门文章

  1. Javascript aop(面向切面编程)之around(环绕)
  2. ubuntu服务器启动过程中重启卡死的问题解决办法
  3. java io读书笔记(2)什么是stream
  4. 【idea中debug的使用】
  5. Java黑皮书课后题第6章:**6.28(梅森素数)如果一个素数可以写成2^p-1的形式,其中p是某个正整数,那么这个素数就称作梅森素数。编写程序,找出p≤31的所有梅森素数,然后显示如下结果
  6. linux父子进程字写父读无效,linux父子进程
  7. MySQL 查询表中某字段值重复的数据
  8. 1.15运行命令直至执行成功
  9. plist 文件的读写
  10. mysql手工注入——盲注