libmodbus:C 语言 Modbus 协议库,LGPL 商用前要看清楚
想把 Modbus 能力嵌进自己的 C/C++ 程序或设备固件,libmodbus 是最省事的选择;但它是库不是工具,而且 LGPL-2.1 对闭源商用有前提条件,动手前要自己确认清楚。
- 授权
- LGPL-2.1 开源
- 平台
- Linux / Windows / macOS
- 协议
- Modbus RTU、Modbus TCP
- 官网
- http://libmodbus.org
- 源码
- https://github.com/stephane/libmodbus
- · 要在自己的上位机、网关固件、采集服务里直接收发 Modbus 报文,不想从零手写协议栈
- · 目标是嵌入式或资源受限设备,需要一个 C 语言、可交叉编译的依赖
- · 只想连上设备读几个寄存器看看的人——它是库不是图形工具,装上也没有界面,开箱调不了设备
- · 项目要求全部依赖必须是宽松许可证(MIT/BSD/Apache)且法务不接受 LGPL 的场合
- 文件名
- libmodbus v3.2.0 源码
- 版本
- v3.2.0
- SHA256
- 待补(尚未实际核对,不填占位值)
- 核对于
- 2026-09-02
本站不托管安装包,上方为官方渠道直链。下载后请自行核对 SHA256,与上表不一致说明文件被改动过。
先把最容易走错的那一步挡掉。
如果你现在的需求是「连上一台设备,读几个寄存器看看值对不对」,你要的不是 libmodbus。 它没有界面,装完也不会多出一个可以点开的程序。你要的是图形工具:QModMaster 免费开源、解压即用,MThings 是国产免费工具,Modbus Poll 是这个领域用得最久的商业软件。想连报文都懒得自己拼,站内还有串口调试台可以直接在网页里发字节。
libmodbus 是给另一类人准备的:你要写代码,而且这段代码得会说 Modbus。
它到底是什么
libmodbus 是一个用 C 语言写的 Modbus 协议库,官网在 libmodbus.org,源码在 GitHub 的 stephane/libmodbus,许可证是 LGPL-2.1,最新版本 v3.2.0 发布于 2026 年 7 月 2 日。
「库」这个词的含义要说透。它交付给你的是一堆头文件和编译产物,你把它链接进自己的程序,然后在自己的代码里调用它去收发 Modbus 报文。它替你处理的是协议层那些琐碎又容易写错的事:报文怎么组装、校验怎么算、串口怎么按帧切分、超时和重试怎么处理。你不用再对着协议文档手搓字节。
它的具体接口长什么样、支持到什么程度,以官方文档为准——本文不复述函数签名和参数,那类信息随版本变化,抄在这里只会误导你。
真实的使用场景通常是这几种:
上位机软件。你在做一套设备监控程序,要周期性地去几十台从站上取数据。协议部分交给 libmodbus,你专心写界面和业务逻辑。
网关固件。一头接 Modbus RTU 的现场设备,一头往上传 MQTT 或者 HTTP。中间那段翻译工作里,Modbus 这一侧就是它在干。
数据采集服务。跑在工控机或者嵌入式 Linux 上的常驻进程,采数、存库、报警。这类程序对稳定性和资源占用敏感,用 C 库比拉一整套运行时轻。
设备本身。你的产品要作为 Modbus 从站被别人的系统读,或者要作为主站去读别的传感器。这时候代码是要烧进设备里的——也正是这个场景,让下面这段许可证的讨论变得不是空话。
LGPL-2.1 对商用意味着什么
这是本页最需要你认真看的一段,因为它影响的不是好不好用,是能不能用。
先讲通用常识,LGPL 和 GPL 的关键差别在这里:
GPL 有传染性。 你的程序链接了一个 GPL 库,通常你自己的代码也得按 GPL 开放出来。这对闭源商业产品基本等于不能用。
LGPL 是为了让库能被闭源软件用而专门设计的。 核心让步是:你的程序动态链接这个库,你自己的代码不必开源,闭源商用是被允许的。这也是很多商业软件敢用 LGPL 库的原因。
但让步是有条件的,条件主要是两条:
第一,你要是改了库本身,改动部分仍然要以 LGPL 开放。 注意区分「用库」和「改库」——调用它的接口是用,为了适配你的硬件去动它的源码是改。后者不再享受前面那条豁免。
第二,静态链接的情形,条款要复杂得多。 嵌入式项目最容易在这里出问题:为了省空间、图省事,很多人默认就是把库静态编进固件的。这个动作在 LGPL 下需要满足额外的条件,具体是什么、你的做法算不算满足,必须结合你的实际分发方式去看许可证原文。
说明一下这段话的性质:以上是对许可证类型的通用说明,不构成法律意见。 你的项目具体怎么链接、以什么形式分发、有没有改动库源码、面向的是国内还是海外客户,这些都会影响结论。商用前请自己读一遍许可证原文,或者交给法务确认。 这件事的成本远低于产品出货之后才被人指出来。
反过来说,如果你的项目是内部使用、不对外分发,或者你本来就打算开源,这一段基本不构成障碍。真正需要停下来想清楚的,是「闭源产品 + 要出货 + 静态链接进固件」这个组合。
顺带一提,站内的 QModMaster 用的是 LGPL-3.0,它的官方描述里就提到自己基于 libmodbus——同一个协议栈,被包了一层界面之后就变成了普通人点几下就能用的调试工具。这也从侧面说明了库和工具的关系。
和 pymodbus 怎么选
站内还有一篇 pymodbus,是 Python 的 Modbus 库,BSD-3-Clause 许可证,最新版 v3.15.0 发布于 2026 年 8 月 13 日。两者做的是同一件事,选哪个基本上不是「谁更好」,而是你的程序本来就是用什么语言写的。
选 C 库的情形:代码要编进固件、跑在资源受限的设备上、或者交叉编译到嵌入式 Linux;对内存占用和启动时间敏感;已有的工程本来就是 C/C++ 的,多拉一套 Python 运行时反而是负担。
选 Python 库的情形:写测试脚本、做设备验收、快速验证一个想法、给一堆从站批量刷参数。这类活儿用 Python 半小时能写完,用 C 写要花一下午还得处理编译问题。另外 BSD-3-Clause 是宽松许可证,前面那段许可证的顾虑在它身上不存在。
很常见的组合是两个都用:产品固件里跑 C 库,测试和产线工装用 Python 脚本。这不矛盾。
写代码之前要先搞明白的几件事
协议库能替你算 CRC、拼报文,但下面这些坑它替不了你,写代码之前想清楚能省掉大量排查时间。
RTU 和 TCP 的帧结构不一样。 Modbus RTU 每帧末尾带 CRC 校验,靠字节间的静默间隔来判断一帧结束;Modbus TCP 前面加了 MBAP 头,里面有事务标识和长度字段,因为 TCP 本身保证了完整性,所以不再带 CRC。以为「TCP 就是把 RTU 塞进 socket」是新手最常见的误解之一。要手工验 RTU 的校验值,用站内的 CRC / Modbus 校验计算器。
寄存器编号和报文地址常常差 1。 设备手册上写 40001,报文里可能要填 0。读出来整体偏移一格、或者值明显不对,先怀疑这个,而不是怀疑库有 bug。
32 位量有四种字序。 一个 32 位浮点或整数拆成两个 16 位寄存器存,高低字的排列方式各家厂商都不一样。数值看着像乱码但每次读都一样,那就是字序问题,不是通信问题。这部分逻辑要你自己在代码里处理。
串口是字节流,不是消息流。 你从串口读到的可能是半帧,也可能是一帧半。RTU 靠帧间静默时间来判断边界,协议库会处理这件事,但在高波特率、或者操作系统调度不及时的情况下,判帧仍然可能出错。跑在非实时系统上时尤其要留意。
总线是一主多从。 一条 RS-485 总线上同一时刻只能有一个主站发起请求,从站地址不能重复。地址撞了的表现是回复混乱或者干脆超时,和线没接好几乎分不出来。物理层的收发方向控制、终端电阻这些见 RS-485 差分总线,串口本身的原理见 UART 串口原理。
拿到源码之后
官方渠道是 libmodbus.org 和 GitHub 上的仓库,当前版本 v3.2.0。它是以源码形式发布的,具体的构建方式、依赖和平台支持情况,以仓库里的官方说明为准——各平台的构建步骤会随版本调整,照着一篇文章里抄来的命令敲,往往还不如直接看仓库根目录的说明文件快。
联调阶段有个实用建议:先用图形工具把设备本身确认一遍,再写代码。 先用 QModMaster 或 MThings 把串口参数、从站地址、寄存器地址这几项试通,确认设备确实能按预期回话,然后再动手写程序。否则程序读不到数据的时候,你没法判断是自己代码写错了还是设备压根没接对,两个变量搅在一起最难查。串口本身通不通,可以先用 UartAssist 这类工具发几个字节确认一下。
其余嵌入式与工业通信的软件工具,见软件与工具库。
本文为公开资料整理,非亲测。关键参数与代码请结合实物与下列官方来源验证。
- libmodbus 官网 ↗
libmodbus.org
- libmodbus 官方仓库(LGPL-2.1,v3.2.0 发布于 2026-07-02) ↗
github.com/stephane/libmodbus
延伸阅读
如果你点进来其实是想调一台设备而不是写代码,回到软件与工具库挑一个图形工具, QModMaster 和 MThings 都是免费的。 真要动手写代码,报文对不对得上先用CRC / Modbus 校验计算器验一遍, 帧在两根线上怎么跑见UART 串口原理与RS-485 差分总线。
- pymodbus 工业通信·Modbus工具
- QModMaster 工业通信·Modbus工具