libmodbus报文打印、记录;适配多个版本

这篇具有很好参考价值的文章主要介绍了libmodbus报文打印、记录;适配多个版本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为什么要做这个?

        libmodbus可以通过本身的设置,把读取和下发的报文都输出到终端中。这种方式用作平常的调试还行。但是如果相对这些报文单独处理,或者是进行细致化的操作的话,就变得不是很方便。

        所以在原先的基础上,做了一些改变,方便从库中拿到modbus的报文,以方便不同的开发需求。

函数介绍

        不同版本的libmodbus中,读写报文有着不同的区别,但是我都做了适配。 函数命名规则就是在原先的函数的名字加上_msgs。

        以读取功能码3为例子:

//这是库本身读取功能码3的函数
MODBUS_API int modbus_read_registers(
    modbus_t *ctx, int addr, int nb, uint16_t *dest);

/*
这是新增函数,用来接收报文;
参数:
    sbuf:下发报文
    slen:下发报文长度
    rbuf:上送报文
    rlen:上送报文长度(当接收报文失败,长度为0)
返回值:
    保持和libmodbus一致
*/
MODBUS_API int modbus_read_registers_msgs(
    modbus_t *ctx, int addr, int nb, uint16_t *dest,
    uint8_t *sbuf, int *slen, uint8_t *rbuf, int *rlen);

demo

int test01()
{
	modbus_t *ctx;
	ctx = modbus_new_rtu("COM3", 9600, 'N', 8, 1);
	if (ctx == NULL) {
		fprintf(stderr, "Unable to create the libmodbus context\n");
		return -1;
	}
	modbus_set_response_timeout(ctx, 0, 999999);

	modbus_set_slave(ctx, 1);
	//modbus_set_debug(ctx, 1);
	modbus_set_error_recovery(
		ctx,
		MODBUS_ERROR_RECOVERY_LINK
	);
	if (modbus_connect(ctx) == -1) {
		fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
		modbus_free(ctx);
		return -1;
	}

	uint16_t dest[20] = { 0 };
	uint8_t sbuf[20] = { 0 };
	int slen = 0;
	uint8_t rbuf[20] = { 0 };
	int rlen = 0;

	modbus_read_registers_msgs(ctx, 1, 1, dest, sbuf, &slen, rbuf, &rlen);
	// modbus_read_registers(ctx, 1, 1, dest);
	// modbus_read_bits(ctx, 11, 10, sbuf);
	printf("Connection failed: %s\n", modbus_strerror(errno));

	printf("____\n");
	for (size_t i = 0; i < slen; i++)
	{
		printf("%x ", (uint8_t*)sbuf[i]);
	}
	printf("\n");
	for (size_t i = 0; i < rlen; i++)
	{
		printf("%x ", (uint8_t*)rbuf[i]);
	}

	std::cout << slen << " " << rlen << std::endl;


	modbus_close(ctx);
	modbus_free(ctx);
}

结果:

Connection failed: No error
____
1 3 0 1 0 1 d5 ca
1 3 2 0 0 b8 44 8 7

仓库介绍:

        标题中写到“适配多个版本”,而不同的版本在不同分支中。

主分支:只是我fork的开源作者的仓库的主分支罢了。

        该分支,不支持本文说的功能。

分支1:modbus_3.1.2_RTUoverTCP_msg

        首先modbus版本是3.1.2,然后作者并没有完全合到主分支上,根据作者的意思,他也不打算往上面合。

        我的这个分支是跟着另外一个开发者的分支做的改动。

        这个分支的特点是支持RTU跑在TCP链接连接上。

分支2:modbus_3.1.6_unify_file_registers_msg

        首先modbus版本是3.1.6。主分支也没有合并,看作者意思是说要合并了,但是一直没弄。

        同样这个分支也是根据另外一个开发者的分支来做的。

        这个分支的特点是支持功能码20、21.

分支3:modbus_3.1.10_msg

        这个分支,只是目前最新主干,基于这个做了一个报文记录

        

下载地址:

去github下载文章来源地址https://www.toymoban.com/news/detail-812495.html

到了这里,关于libmodbus报文打印、记录;适配多个版本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++上位软件通过LibModbus开源库和西门子S7-1200/S7-1500/S7-200 PLC进行ModbusTcp 和ModbusRTU 通信

            一直以来上位软件比如C++等和西门子等其他品牌PLC之间的数据交换都是大家比较头疼的问题,尤其是C++上位软件程序员。传统的方法一般有OPC、Socket 等,直到LibModbus 开源库出现后这种途径对程序袁来说又有了新的选择。           1 )使用简单, 利用MUDBUS库文件

    2024年02月03日
    浏览(41)
  • 微信聊天记录导出的开源项目,火了!

    大家好,我是 Jack。 今天又是分享开源项目的一天。 最近想训练一个符合某人说话风格的 AI,微信的聊天记录里就有着丰富的训练数据。 聊天记录是珍贵的记忆,也是每一场对话、每一个互动的真情流露。 想要拿到这些数据,无论是保存备份还是用于 AI 训练,手动拷贝都不

    2024年01月16日
    浏览(35)
  • GIT版本号命名通用规则,开源项目版本号通用规则

    该规则对版本的迭代顺序命名做了很好的规范,其版本号的格式为 X.Y.Z(又称为Major.Minor.Patch) ,递增的规则为: 序号 格式要求 说明 X 非负整数 表示主版本号(Major),当API的兼容性变化时,X需递增。 Y 非负整数 表示次版本号(Minor),当增加功能时(不影响API)的兼容性

    2024年02月07日
    浏览(27)
  • 开源项目的版本管理:Git的最佳实践

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月05日
    浏览(31)
  • iOS问题记录 - Xcode 14.3版本运行项目报错

    看到Xcode有新版本,没忍住点了升级,然后问题来了。 2023/06/24更新:关于Xcode 14.3版本打出来的包在iOS 13版本报错的问题,经过iOS 13.7版本真机实测,这个问题在Xcode 14.3.1版本已经修复,建议升级。Xcode 14.3.1的发布说明也提及了这个问题的修复。 2023/04/23更新:关于Xcode 14.3版本

    2023年04月09日
    浏览(32)
  • iOS问题记录 - Xcode 14.3版本打包项目报错

    前几天升级Xcode到14.3版本,运行项目报错,于是写了iOS问题记录 - Xcode 14.3版本运行项目报错这篇文章。没想到除了运行项目有问题,打包项目也有问题。 macOS: 13.3 Xcode: 14.3 CocoaPods: 1.12.0 [ Xcode菜单栏 ] - [ Product ] - [ Archive ],进行打包操作。执行到 Run custom shell script \\\'[CP] Embed

    2023年04月16日
    浏览(34)
  • 开源项目CuteSqlite开发笔记(七):CuteSqlite释放BETA版本啦

    经过大半年的开发,CuteSqlite程序代码不知不觉来到了6万行,有效行数4万行,CuteSqlite开发完成了一个小版本,进入下一个阶段,并于2024元旦释放BETA版本,有兴趣的朋友可以下载试用。 CuteSqlite是一个开源的SQLite图形化管理客户端。 特点: 1. 功能完善:目标是做最好的SQLit

    2024年01月16日
    浏览(26)
  • CANoe使用记录(三):CANoe发送报文设置

    目录 1、概述 2、报文发送 2.1、interactive generators(交互生成器) 2.2、重命名发送报文  2.3、增加报文 2.4、触发方式  2.5、从DBC导入报文 2.6、设置信号值         很大一部分时候,在控制零部件时候,需要发送报文到下位机,此时可以采用CANoe的报文发送功能实现,CANoe的报

    2023年04月27日
    浏览(42)
  • Springboot - 打印多个yml最终合并配置信息

    Springboot项目中多个yml配置优先级和最终配置容易混淆,本文帮助打出yml优先级和最终配置,以yml格式打印到控制台,便于开发调试。 一、服务启动后打印 二、监听事件打印

    2024年02月11日
    浏览(39)
  • Flutter & Android问题记录 - 升级Android Studio 2022.2.1版本后运行项目报错

    最近一个Flutter项目有新需求,开发时一直是在iOS设备上运行,花了几天做完后运行到Android设备测试,结果项目构建失败了。 Flutter: 3.7.11 Android Studio: 2022.2.1 Java: 17.0.6 Gradle: 7.4 Android Gradle Plugin (AGP): 4.1.3 项目构建报错日志: 报错有点眼熟,根据以往开发经验,应该是Gradle版本

    2023年04月24日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包