• Windows下libmodbus 支持upd库的编译与Qt里的调用


    一. libmodbus 支持udp版库下载
    https://github.com/systemmonkey42/libmodbus/tree/udp_support
    二. MSYS2编译工具安装
    (1)下载MSYS2并安装
    下载地址:https://www.msys2.org/在这里插入图片描述
    在这里插入图片描述
    双击该exe,安装msys2
    在这里插入图片描述
    (2) 安装编译所需库
    在软件安装后所在位置,找到MINGW64.exe并打开
    在这里插入图片描述
    更新msys2,在命令行里输入pacman -Syu

    pacman -Syu
    
    • 1

    在这里插入图片描述
    之后会提示更新完成,需要关闭MSYS2方可成功,如下图输入Y后按下回车键,MSYS2会自动关闭

    重新打开MSYS2,输入如下命令安装gcc

    pacman -S mingw-w64-x86_64-gcc
    
    • 1

    在这里插入图片描述输入如下代码安装automake

    pacman -S automake
    
    • 1

    在这里插入图片描述
    输入如下代码,安装libtool

    pacman -S libtool
    
    • 1

    在这里插入图片描述
    autoconf-wrapper 所需库安装

    pacman -S autoconf-wrapper
    
    • 1

    在这里插入图片描述
    三. 编译libmodbus库
    (1) 打开libmodbus的解压文件,注意到里面的autogen.sh文件
    在这里插入图片描述
    (2) 进入autogen.sh 所在目录后,输入如下命令

    ./autogen.sh
    
    • 1

    (3) 继续输入命令

    ./configure
    
    • 1

    在这里插入图片描述
    (4)至此完成了对libmodbus在Windows下的编译过程

    四.libmodbus导入Qt Creator中使用的方式
    (1) 新建一个mymodbusTest工程,同时在工程目录下创建libmodbus目录名
    (2) 将modbus编译后生成的config.h 以及src目录下所有的.c .h 文件,全部复制到libmodbus目录中
    在这里插入图片描述
    在这里插入图片描述
    (3) 通过添加现有文件,将这些libmodbus库文件添加到qt工程中
    在这里插入图片描述
    (4) ws2_32.dll库文件的复制
    打开C:Windows\System32
    在这里插入图片描述
    复制后结果如下:
    在这里插入图片描述
    (5) 在.pro文件中加上”LIBS += -Ldll -lws2_32”
    (6) 修改libmodbus文件夹下的modbus-private.hmodbus.c代码中的 #include #include
    (7) 更改modbus-udp.c文件代码
    在这里插入图片描述
    (8) 在main.cpp文件中编写如下代码,测试udp

    #include 
    #include 
    #include
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        modbus_t *ctx;
    
        // 创建一个 libmodbus 上下文
        ctx = modbus_new_udp("127.0.0.1", 502);
        if (ctx == NULL) {
            qDebug() << "Failed to create MODBUS context.";
            return 1;
        }
    
        // 连接到远程 MODBUS 服务器
        if (modbus_connect(ctx) == -1) {
            qDebug() << "Failed to connect to MODBUS server.";
            modbus_free(ctx);
            return 1;
        }
    
        // 读取一个寄存器的值
        uint16_t reg_value[5];
        int rc = modbus_read_registers(ctx, 0, 5, reg_value);
        if (rc == -1) {
            qDebug() << "Failed to read MODBUS register.";
        } else {
    //        qDebug() << "MODBUS register value:" << reg_value[1];
            for (int i = 0; i < rc; ++i) {
                 printf("%u ", reg_value[i]);
             }
        }
    
        // 断开与远程 MODBUS 服务器的连接
        modbus_close(ctx);
        modbus_free(ctx);
    
        return a.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    (9) 使用modbus slave软件测试
    在这里插入图片描述
    附:相关软件下载,需要请留言
    msys2 下载
    链接:https://pan.baidu.com/s/1df3N5oDvQhApMNM2dNZcow

    libmodbus-udp_support.zip
    链接:https://pan.baidu.com/s/1m7sUtjGE-47a0wOJAYeETw

    mbslaveX64.exe
    链接:https://pan.baidu.com/s/1nxcN9kIUVwSMTGGjjiMCUA

  • 相关阅读:
    LFMCW雷达的距离分辨率
    java多线程
    基于nodejs+vue 衣服穿搭推荐系统
    聊聊客户档案模型的设计与管理
    一年时间过去了,LiveData真的被Flow代替了吗? LiveData会被废弃吗?
    详解ConCurrentHashMap源码(jdk1.8)
    C# 读写文件从用户态切到内核态,到底是个什么流程?
    Android native层Hander原理分析
    【机器学习】sklearn对数据预处理
    [C++][算法基础]求组合数(II)
  • 原文地址:https://blog.csdn.net/huangdenan/article/details/133297522