00. 目录
01. 开发环境
Qt环境:Qt5.15 或者Qt6
VS环境:Visual Studio 2019
02. Visual Studio 2019生成动态库
03. 新建Qt项目
3.1 创建Qt纯C项目
3.2 将Visual Studio 2019生成的动态库相关文件和头文件拷贝到当前Qt项目所在的目录中。
3.3 右击Qt项目,选择添加库
3.4 选择外部库
3.5 设置外部库
3.6 添加头文件,选择对应的.h文件即可
04. 编写测试程序
程序示例
#include <stdio.h>
#ifndef _MSC_VER
#include <unistd.h>
#endif
#include <string.h>
#include <stdlib.h>
#include <errno.h>
//包含Modbus相关头文件
#include "modbus.h"
//相关参数设置
#define LOOP 1 //循环次数
#define ADDRESS_START 0 //测试寄存器起始地址
#define ADDRESS_END 99 //测试寄存器结束地址
int main(void)
{
modbus_t* ctx = NULL;
int ret = -1;
int nums = 0;
int addr = 0;
int i = 0;
int tmp = 0;
uint16_t* tab_rq_registers = NULL;
uint16_t* tab_rp_registers = NULL;
//设置随机种子
srand((int)time(0));
//1. 创建一个TCP类型的变量
ctx = modbus_new_tcp("192.168.1.90", 10086);
if (NULL == ctx)
{
fprintf(stderr, "Error: %s\\n", modbus_strerror(errno));
return 1;
}
else
{
printf("设置TCP成功\\n");
}
//2. 设置Debug模式
ret = modbus_set_debug(ctx, TRUE);
if (-1 == ret)
{
fprintf(stderr, "Error: 设置Debug模式失败");
modbus_free(ctx);
return 1;
}
//3. 连接Server
ret = modbus_connect(ctx);
if (-1 == ret)
{
fprintf(stderr, "Connection failed: %s\\n", modbus_strerror(errno));
modbus_free(ctx);
return 1;
}
//4. 计算需测试的寄存器个数
nums = ADDRESS_END - ADDRESS_START;
//5. 申请内存 保存发送和接收的数据
tab_rq_registers = (uint16_t*)malloc((nums + 1) * sizeof(uint16_t));
if (NULL == tab_rq_registers)
{
fprintf(stderr, "malloc failed\\n");
modbus_free(ctx);
return 1;
}
else
{
memset(tab_rq_registers, 0, (nums + 1) * sizeof(uint16_t));
}
tab_rp_registers = (uint16_t*)malloc((nums + 1) * sizeof(uint16_t));
if (NULL == tab_rp_registers)
{
fprintf(stderr, "malloc failed\\n");
modbus_free(ctx);
return 1;
}
else
{
memset(tab_rp_registers, 0, (nums + 1) * sizeof(uint16_t));
}
//7. 测试保持寄存器的单个读写
//随机数字
for (i = 0; i < nums; i++)
{
tmp = rand() % 100;
tab_rq_registers[i] = tmp;
if (0 == i)
{
printf("写入的值: ");
}
printf("%hd ", tab_rq_registers[i]);
}
//换行
printf("\\n");
addr = ADDRESS_START;
//先写入,后读取该数据到指定的内存中
ret = modbus_write_and_read_registers(ctx, addr, nums + 1, tab_rq_registers,
addr, nums + 1, tab_rp_registers);
if (nums + 1 != ret)
{
printf("Error modbus_write_and_read_registers: %d\\n", ret);
printf("Address: %d nums: %d\\n", addr, nums + 1);
}
else
{
//输出
for (i = 0; i < nums; i++)
{
if (0 == i)
{
printf("读取到的值: ");
}
printf("%hd ", tab_rp_registers[i]);
}
//换行
printf("\\n");
}
//再次读取数据
memset(tab_rp_registers, 0, (nums + 1) * sizeof(uint16_t));
ret = modbus_read_registers(ctx, addr, nums + 1, tab_rp_registers);
if (nums + 1 != ret)
{
printf("Error modbus_read_registers: %d\\n", ret);
}
else
{
//输出
for (i = 0; i < nums; i++)
{
if (0 == i)
{
printf("读取到的值: ");
}
printf("%hd ", tab_rp_registers[i]);
}
//换行
printf("\\n");
}
//8. 释放内存
free(tab_rp_registers);
free(tab_rq_registers);
//9. 断开连接
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
执行结果
05. 其它参考
加载示例
# 请配置 Mysql 的包含库路径
win32:INCLUDEPATH += "D:/Mysql/mysql-5.7.15-win32/include"
# 请配置 Mysql 的静态库路径
win32:LIBS += "-LD:/Mysql/mysql-5.7.15-win32/lib" -llibmysql
静态库标示符注意事项
-L :后面要跟的是lib文件的路径名,不可以有空格。
-l :后面跟的是要加载的静态库lib文件名,是文件名,不要加后缀名,要链接着写,别加空格。
Qt帮助文档
双击选中关键字 “LIBS” || “INCLUDEPATH” 按下键盘的F1键 调用 Qt自带的帮助文档。
加载不到静态库情形
空格路径
LIBS += “-LE:\\Work For CEAC\\joy_20161213\\Code\\External\\bin” -lSystemModule_znjd
路径中存在空格时,务必用双引号引起来。
06. 附录
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容