代码编织梦想

1. libmodbus库的使用

Step 1:初始化RTU/TCP指针

modbus_t *ctx;
ctx = modbus_new_tcp(NULL,502);

Step 2:初始化变量

在这里插入代码片

Step 3:申请内存

mb_mapping = modbus_mapping_new(BITS_ADDRESS + BITS_NB,
                                INPUT_BITS_ADDRESS + INPUT_BITS_NB,
                                REGISTERS_ADDRESS + REGISTERS_NB,
                                INPUT_REGISTERS_ADDRESS + INPUT_REGISTERS_NB);

Step 4:监听端口

server_socket = modbus_tcp_listen(ctx,1);

Step5:接收数据

modbus_tcp_accept(ctx,&server_socket);

Step6:获取查询报文

rc = modbus_receive(ctx,query);

Step7:关闭连接

modbus_mapping_free(mb_mapping);
modbus_close(ctx);
modbus_free(ctx);

2. Modbus TCP开发实践

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <iostream>
#include "modbus.h"
#include "config.h"
#define SERVER_ID	1	//从端设备地址

using namespace std;

int main(void)
{
    int server_socket = -1;
    modbus_t *ctx;
    modbus_mapping_t *mb_mapping;
    ctx = modbus_new_tcp(NULL,502);
    modbus_set_debug(ctx,FALSE);

    //modbus_set_slave(ctx,SERVER_ID);

    //申请内存区用于存放寄存器数据
    mb_mapping = modbus_mapping_new(500,500,500,500);
    if(mb_mapping == NULL)
    {
        fprintf(stderr,"Failed mapping:%s\n",modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }

    //开始监听端口
    server_socket = modbus_tcp_listen(ctx,1);
    if(server_socket == -1)
    {
        fprintf(stderr,"Unable to listen TCP.\n");
        modbus_free(ctx);
        return -1;
    }


    // 开始接收数据
    modbus_tcp_accept(ctx,&server_socket);

    while(1)
    {
        uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
        int rc;

        rc = modbus_receive(ctx,query); //获取查询报文
        if(rc >= 0)
        {
            /* rc is the query size */
            mb_mapping->tab_registers[1] = 2333;   // 将2333写入地址为1的保持寄存器,可简单理解为发送到客户端
            modbus_reply(ctx,query,rc,mb_mapping); // 回复响应报文
            cout<<mb_mapping->tab_registers[0]<<endl;// 打印第一个保持寄存器
        }
        else
        {
            // Connection closed by the client or error
            printf("Connection Closed.\n");

            //Close ctx
            modbus_close(ctx);

            //等待下一个客户端报文
            modbus_tcp_accept(ctx,&server_socket);
        }

    }

    printf("Quit the loop:%s\n",modbus_strerror(errno));

    modbus_mapping_free(mb_mapping);
    modbus_close(ctx);
    modbus_free(ctx);

	return 0;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_43455581/article/details/109681006

笔记--记录一次在libmodbus通讯过程socket的connect()遇到的Operation now in progress 的bug-爱代码爱编程

先说结论: 因为我进行通讯的两台设备的mac 地址相同!  所以如果遇到这个问题的话  可以先去排查设备的mac 是否相同!! 最近公司的一个项目用到了两台嵌入式linux设备之间通过modbus进行通讯,再实际测试中出现了以下的情况:两台设备虽然设置了不同的ip  但是通过SSH 进行远程登陆的过程中 还是很卡顿(排除网络问题了,内网且路由器下只有3个

ubuntu下配置libmodbus过程记录-爱代码爱编程

使用说明: https://libmodbus.org/documentation/法1 ubuntu package sudo apt-get install libmodbus-dev sudo apt-get install libmodbus5 https://packages.ubuntu.com/search?keywords=l

libmodbus ubuntu 下交叉编译QNX 下的库-爱代码爱编程

1. 环境变量设置 (我这里是用的ubuntu 编译的) source ./qnxsdp-env.sh 2.  确认 设置成功 echo $QNX_TARGET /home/xxx/qnx/qnx700/target/qnx7 3. 下载 libmodbus 源文件  https://github.com/stephane/libmodb

MODBUS通讯:libmodbus库使用方法-爱代码爱编程

MODBUS通讯:libmodbus库使用方法 libmodbus是一个快速、跨平台的Modbus库,目前支持Linux, Mac OS X, FreeBSD, QNX和Windows系统。libmodbus版本号:v3.0.8(已加入v3.1.6版本补充)。 libmodbus是可以与使用Modbus协议的设备进行数据发送/接收的库。该库包含各种后端

Arm Qt 实战二:使用libmodbus创建MobusRtu-modbus_new_rtu为NULL的问题-爱代码爱编程

this->ctx=modbus_new_rtu("/dev/ttyO2", 9600,'n',8,1); if (ctx == NULL) { fprintf(stderr, "Unable to create the libmodbus context\n"); return; } 使

RT-Thread 应用笔记 - libmodbus RTU RS485 从机-爱代码爱编程

RT-Thread 应用笔记 - 不正确使用LOG也会引发hard fault RT-Thread 应用笔记 - RTC Alarm组件的使用 RT-Thread 应用笔记 - freemodbus RTU RS485 从机 RT-Thread 应用笔记 - freemodbus RTU RS485 主机 RT-Thread 应用笔记 - libm

CRC16校验 C语言实现-爱代码爱编程

文章目录 1 crc.c2 crc.h 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。 本文实现 CRC16 的C语言校验算法,采用的是查表的方法。

给老婆滴的请假条_过路老熊_新浪博客-爱代码爱编程

                              给老婆滴的请假条 亲乃滴老婆大人:   今天下午偶怀着无比沉痛的心情告诉您:我不能回家陪您吃晚饭了,我本来是想马上立即快速准确的把这个噩耗告诉您的,可办公室的那几个“气管炎” 严防、鄙视、高乐抱着电话跟他们老婆解释不能回去的原因都说了2个小时了,还没有结束,真TMD罗嗦!(请您原谅

鸿蒙硬件HI3861-4G透传模块-MODBUS-爱代码爱编程

鸿蒙HI3861-4G透传模块-MODBUS(暂时还没完) 如果有什么问题可以来B站问我 https://space.bilibili.com/309103931 1.简介 将使用HI3861测量温湿度,然后通过4G模块透传(AIR724UG)发送MODBUS数据给ONENET平台和自己的MODBUS服务器 这是我买的4G模块透传(AIR724U

MODBUS通讯:libmodbus库使用方法-爱代码爱编程

MODBUS通讯:libmodbus库使用方法 libmodbus是一个快速、跨平台的Modbus库,目前支持Linux, Mac OS X, FreeBSD, QNX和Windows系统。libmodbus版本号:v3.0.8(已加入v3.1.6版本补充)。 libmodbus是可以与使用Modbus协议的设备进行数据发送/接收的库。该库包含各种后端

小孩长高吃什么好?-爱代码爱编程

身高与遗传因素关系密切(75%),但后天因素也起很大作用。儿童时期注意以下几点可以长高。 1.睡足、熟睡。儿童熟睡后脑垂体分泌生长激素多,易长高。不然就分泌的不足。生长激素在儿童生长中起关键作用。 2.早睡。生长激素分泌的高峰期在熟睡1小时以后。通常在22时

物联网IoT上云协议之Modbus快速入门教程-爱代码爱编程

本文转载, 原文作者:源码先生, 文章链接:https://www.debugself.com/2020/01/01/modbus_guide/, 请勿用于商业用途,如有侵权,请告知删除。 物联网IoT上云协议之Modbus快速入门教程 什么是Modbus Modbus和OPC UA、mqtt本质一样,都是为了实现多个设备相互通信的应用层协议。Mod