libmodbus在线文档

https://www.jianshu.com/p/d93c17485c0a

原创篇

参考上一篇转载的博客,我的ubuntu上的最终生成的动态库的路径,下图所示

我的linux板子上( 权限最好 777):

我的ubuntu主机上的C语言源代码的路径,四个头文件modbus.h、modbus-rtu.h、modbus-tcp.h、modbus-version.h也都放在了这里

我的C源代码:

/*************************
**
** modbus-rtu-test.c
** 移植libmodbus库到ARM开发板,并测试成功
**
**************************/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include "modbus.h" //modbus动态库文件 unsigned char log[6] = {0x11,0x12,0x13,0x14,0x15,0x16};
#define Path_dat "/root/Test_Data_Dir/record.dat" #define Path_log1 "/root/Test_Data_Dir/log1.dat"
#define Path_log2 "/root/Test_Data_Dir/log2.dat"
#define Path_log3 "/root/Test_Data_Dir/log3.dat"
#define Path_log4 "/root/Test_Data_Dir/log4.dat" /*
int read_data_hex(unsigned char *buf, int length, char *string)
{
FILE *fp;
fp = fopen(string, "rb");
if (NULL == fp)
{
// printf("read: file open Fail!\n");
return -1;
}
fread(buf, sizeof(unsigned char), length, fp); fclose(fp);
fp = NULL;
return 0;
}
*/ int write_data_hex(unsigned char *my_array, int length, char *string)
{
int i = 0;
FILE *fp;
fp = fopen(string, "wb+"); // b 二进制操作
if (NULL == fp)
{
// printf("write: file open Fail!\n");
return -1;
}
while (i < length)
{
fwrite(&my_array[i], sizeof(unsigned char), 1, fp);
i++;
} fclose(fp);
fp = NULL;
return 0;
} //如果手边只有一根USB转串口线,那么只能连接板子的modbus串口和PC机,就不能
//连接PC机和板子的串口调试口了。如何调试?使用write_data_hex()写log观察过程。 int main(int argc, char *argv[])
{
struct timeval t;
uint16_t tab_reg[64] = {0}; //定义存放数据的数组
modbus_t *ctx = NULL; int rc;
int i;
//以串口的方式创建libmodbus实例,并设置参数
//ttySAC0 /dev/ttyS1
ctx = modbus_new_rtu("/dev/ttySAC0", 115200, 'N', 8, 1);
if (ctx == NULL)
{
fprintf(stderr, "Unable to allocate libmodbus contex\n");
return -1;
} printf("MY_Debug: usleep begin! \n"); //这里我给了40秒延时,在这个时间内:你把串口线从板子的串口调试口转为
//连接到板子的modbus串口,打开一个事先设置好串口参数的PC机上的模拟modbus从机的软件
//(我使用的是和modsim32)
//注意:如果前后接的是同一个电脑com口,注意还要把之前的串口调试口对应的上位机软件
// 关闭一下,以便modsim32能够顺利打开该com口。
usleep(40000000); modbus_set_debug(ctx, 0); //设置1可看到调试信息
modbus_set_slave(ctx, 1); //设置slave ID t.tv_sec = 0;
t.tv_usec = 50000;
// 50ms超时时间,下位机回复帧的限制时间:主机发完后,下位机需要在50ms内回应
// *** 必须设置从站的响应超时 小于 主站的响应超时 ***
// 总之,在确保速度满足你所需应用的情况下,把主站的响应超时适当设置大一点,是保险措施
modbus_set_response_timeout(ctx,&t); if (modbus_connect(ctx) == -1) //连接设备
{
write_data_hex(&log[0], 1, Path_log1);
printf("MY_Debug: modbus_connect Fail! \n");
fprintf(stderr, "Connection failed:%s\n", modbus_strerror(errno)); modbus_close(ctx); //关闭modbus连接
modbus_free(ctx); //释放modbus资源,libmodbus需要释放掉
}
else{
printf("MY_Debug: modbus_connect Success! \n");
} while (1)
{
printf("\n 这里的代码只执行一次 return -1,或者 break \n"); rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == -1) //读取保持寄存器的值,可读取多个连续输入保持寄存器
{
write_data_hex(&log[1], 1, Path_log2);
fprintf(stderr,"%s\n", modbus_strerror(errno));
printf("MY_Debug: modbus_read_registers Fail! \n");
return -1;
} // 这里保存为文件,如果你只有一根串口线,方便你观察结果。
write_data_hex(&log[2], 1, Path_log3); write_data_hex(tab_reg, 10, Path_dat); for (i=0; i<10; i++)
{
printf("reg[%d] = %d(0x%x)\n", i, tab_reg[i], tab_reg[i]);
} break;
} write_data_hex(&log[3], 1, Path_log4); //标记代码已顺利结束
modbus_close(ctx); //关闭modbus连接
modbus_free(ctx); //释放modbus资源,使用完libmodbus需要释放掉 return 0;
}

我的makefile:

CC = arm-none-linux-gnueabi-gcc

#CFLAGS    += -I../include -std=gnu99 -lm -lpthread -O3 -lstdc++

LIBS    += -L /home/aston/LibModbus_Study/installHere/lib -lmodbus

TARGET=main.out

SRCS =     Lib_Modbus_test.c 

OBJS = $(SRCS:.c=.o)

$(TARGET):$(OBJS)
$(CC) $(LDFLAGS) $^ -o $@ $(LIBS) clean:
rm -rf $(TARGET) $(OBJS)

我使用到的工具软件: ModSim32

D:\Study_2019\LibModbus\使用到的工具软件\ModSim32 v1.A00-04

软件使用介绍:

先点击New, 就可以出现‘’2’的界面,并配置好参数,以便后面使用

待linux板子上的程序跑起来以后,用USB转串口线连接好板子的MODBUS串口和PC机的USB口,再点击下图所示的‘3’的Connect

代码中读取到的寄存器的值展示:

实验成功。注意,modbus一个寄存器占两个字节。大小端有区分。

玩转Libmodbus(二) 写代码体验的更多相关文章

  1. 让 AI 为你写代码 - 体验 Github Copilot

    前几天在群里看到有大神分享 Copoilot AI 写代码,看了几个截图有点不敢相信自己的眼睛.今天赶紧自己也来体验一下 Copoilot AI 写代码到底有多神奇. 申请 现在 Copoilot 还 ...

  2. [转]<版本二>写代码的小女孩

    天冷极了,下着雪,又快黑了.这是一年的最后一天——大年夜.在这又冷又黑的晚上,一个乖巧的小女孩在机房里调试程序.她从家里出来的时候还穿着一件外套,但是有什么用呢?那是一双很大的外套——那么大,不知是哪 ...

  3. 亮瞎你狗眼的写代码体验狂拽酷炫效果 activate-power-mode

    年末了,整理一些收藏的资料,没想到发现一个敲代码的装逼神器; 话不多说上图 我是用idea装的,其他编辑器请自行查找 Preferences -> Plugins -> Install p ...

  4. vs2022+resharper C++ = 拥有一个不输clion的代码体验

    这篇文章详细讲一下resharper C++在vs2022中的配置,让他拥有跟clion一样好用的代码补全功能. 为什么clion写代码体验很好好用为啥还要用vs呢,因为网上很多教程都是基于visua ...

  5. 如何结合整洁架构和MVP模式提升前端开发体验(二) - 代码实现篇

    上一篇文章介绍了整体架构,接下来说说怎么按照上图的分层结构实现下面的增删改查的功能. 代码结构 vue userManage └── List ├── api.ts ├── EditModal │ ├ ...

  6. SQL强化(二) 在Oracle 中写代码

    一  : 关于查询中的转换 -- 字符串转换 一 : decode 函数 转换 SELECT DECODE ( PROTYPE.PRO_TYPE_DATE, 'L', '长', 'm', '短', ' ...

  7. 有个AI陪你一起写代码,是种怎样的体验?| 附ICLR论文

    从前,任何程序的任何功能,都需要一行一行敲出来. 后来,程序猿要写的代码越来越多,世界上便有了各种各样的API,来减少大家的工作量.有些功能,可以让API来帮我们实现. 不过,人类写下的话,API并不 ...

  8. Qt侠:像写诗一样写代码,玩游戏一样的开心心情,还能领工资!

    [软]上海-Qt侠 2017/7/12 16:11:20我完全是兴趣主导,老板不给我钱,我也要写好代码!白天干,晚上干,周一周五干,周末继续干!编程已经深入我的基因,深入我的骨髓,深入我的灵魂!当我解 ...

  9. 手写MVC框架(二)-代码实现和使用示例

    --------上一篇:手写MVC框架(一)-再出发----- 背景 书接上文,之前整理了实现MVC框架需要写哪些东西.这周粗看了一下,感觉也没多少工作量,所以就计划一天时间来完成.周末的时间,哪会那 ...

随机推荐

  1. 力扣Leetcode 560. 和为K的子数组

    和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...

  2. 记录学习docker命令的随笔

    docker安装与启动 安装docker yum包更新到最新  sudo yum update 安装需要的软件包  sudo yum install -y yum-utils device-mappe ...

  3. 初学WebGL引擎-BabylonJS:第8篇-阴影网格与活动

    [playground]-shadows(阴影) 源码 var createScene = function () { var scene = new BABYLON.Scene(engine); / ...

  4. codewars贪吃蛇算法题目

    有这样一个题目: Given an n x n array, return the array elements arranged from outermost elements to the mid ...

  5. 支付-微信h5

    背景 h5支付分两种 1.浏览器 2.app 浏览器里的h5,最终也会跳转到app. 而app里的h5,本质是公众号.在微信里叫公众号,支付宝叫服务窗. 这里主要讲微信h5. 核心原理 最终目标是下单 ...

  6. 8svg 自定义全局组件

    0.https://www.npmjs.com/package/vue2-svg-icon 直接使用vue2-svg-icon插件 .如果不使用,就使用下面用法 注意:用阿里图标时候,最好都选择#ff ...

  7. JVM学习第三天(JVM的执行子系统)之开篇Class类文件结构

    虽然这几天 很忙,但是学习是不能落下的,也不能推迟,因为如果推迟了一次,那么就会有无数次;加油,come on! Java跨平台的基础: 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节 ...

  8. shell知识点:${} 的神奇用法

    为了完整起见,我这里再用一些例子加以说明 ${ } 的一些特异功能:假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt我们可以用 ${ } 分别替换获得不同的值 ...

  9. Nginx小功能合集

    13.1. 跨域处理 问题由来:浏览器拒绝执行其它域名下的ajax运作 ---如果浏览器在static.enjoy.com对应的html页面内,发起ajax请求偷盗www.enjoy.com域名下的内 ...

  10. leetcode刷题-82.删除排序链表中的重复元素 II

    题目 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5输出: 1- ...