오픈소스 Modbus 프로토콜栈选型指南:七大프로토콜栈深度对比

무료무료 기술 자료

이 글은 바로 읽을 수 있으며 기초 학습과 검색 유입에 적합합니다.

你为什么要看这篇글

这个문제在 Stack Overflow、control.com、CSDN 上被问了几千次——「我该用哪个오픈소스 Modbus 库?」。每次回答都是零散的几句,没人系统对比过。중국어社区更惨,搜出来的帖子一半在贴十年前 NModbus4 的代码,连 NModbus 主仓库已经迁移到 3.0.x 了都不知道。

我花了三天时间把这七个프로토콜栈的仓库翻了一遍,跑了每个的最小예제,确认了维护状态。下面是结果。如果你赶时间,直接跳到「新手推荐路径」那一段,选你的平台对应的库,开工。

总览对比表

프로토콜栈언어许可Star 数维护状态마스터슬레이브RTUTCP适合谁
FreeModbusCBSD~1.5k低活跃유료✅✅✅STM32 裸机/RTOS
libmodbusCLGPL v2.1+~3.5k活跃✅✅✅✅Linux 산업 제어机/게이트웨이
pymodbusPythonBSD~2.2k非常活跃✅✅✅✅上位机/测试스크립트
NModbusC#MIT~700活跃✅✅✅✅.NET/WinForm 上位机
jamodJavaApache 2.0~300停滞✅✅✅✅Java 遗留系统
modbus-tkPythonLGPL~500低活跃✅✅✅✅快速原型
QtModbusC++LGPL/GPLQt 内置活跃✅✅❌✅Qt 跨平台적용

Star 数是我在 2026 年 6 月抓的,大致数量级对,具体数字你去 GitHub 看一眼就知道。

FreeModbus —— 嵌入式裸机的표준答案

GitHub: https://github.com/cwalter-at/freemodbus

FreeModbus 是 Christian Walter 写的,一个奥地利嵌入式엔지니어링师。这东西在 STM32 圈子里的地位相当于 Linux 内核里的 ext4——你不是不能用别的,但用它是最不会出错的。

**代码体积**:编译完大약 6-12KB ROM,取决于你开了哪些기능 코드和传输모드。RAM 开销几百바이트,主要是那几块데이터缓冲区和事件队列。基本上是个 Cortex-M0 就能跑。

**기능 코드支持**:03(读유지 레지스터)、04(读입력 레지스터)、06(写单个레지스터)、16(写多个레지스터)、01(读코일)、02(读이산 입력)、05(写单个코일)、15(写多个코일)。还有 17(보고서슬레이브 ID)。注意,没有 22(掩码写레지스터)和 23(读写多个레지스터),需要的话得自己加。

**传输모드**:RTU、ASCII、TCP 都支持,通过编译宏开关。

**마스터/슬레이브**:这是 FreeModbus 最容易被误解的地方。官方仓库只오픈소스了슬레이브代码,마스터是유료的。GitHub 上有不少社区魔改版加了마스터功能,比如 armink 的 FreeModbus_Slave-Master-RTT-STM32,오픈소스的,质量不错,但不是官方维护。用这些第三方버전的时候注意:超时处理和重试逻辑实现得很粗糙,别直接上生产。

**코드 예제**——STM32 上初始化一个 RTU 슬레이브,주소 1,통신 속도 9600,패리티 없음:

#include "mb.h"

int main(void) {
    eMBInit(MB_RTU, 0x01, 0, 9600, MB_PAR_NONE);
    eMBEnable();
    while (1) {
        eMBPoll();
    }
}

就这三行。`eMBPoll()` 里跑着整个프로토콜栈的状态机,非阻塞的,你需要在定时器中断里喂 3.5T 超时信号给它。这个 3.5T 定时器是 FreeModbus 移植的头号坑,下面会专门讲。

**已知문제**: - 官方仓库更新极慢,最后的大버전 v1.6 已经好几年没动了,bug 修不修看缘分 - 只支持单시리얼 포트,一个프로토콜栈实例只能绑定一个 UART,多시리얼 포트시나리오要改代码 - TCP 모드用的是 lwIP raw API,不是 socket,这意味着 FreeRTOS+LWIP 환경下能用,但 Linux 上根本跑不了 TCP 모드 - 没有浮点数处理辅助函数,大小端转换自己写

**문서**:只有一份 API 문서,HTML 형식的,够用但谈不上好。중국어社区튜토리얼倒是多,CSDN 搜一下一堆。

libmodbus —— Linux 산업 제어机的不二之选

GitHub: https://github.com/stephane/libmodbus

维护者 Stéphane Raimbault,法国人。libmodbus 是 C 언어写的最成熟的 Modbus 库,没有之一。3.5k star 不是白来的。

这个库的设计思路跟 FreeModbus 完全不同。FreeModbus 是为자료受限的 MCU 设计的,用回调函数和状态机。libmodbus 是 POSIX 风格的,阻塞 API,`modbus_read_registers()` 调用会一直等到데이터回来或超时。写산업 제어机程序的人喜欢这种风格——简单直接,不用管什么状态机。

**기능 코드支持**:几乎所有。01/02/03/04/05/06/07/0F/10/11/16/17,还支持 22(掩码写)和 23(读写多个)。有 `modbus_set_float()` / `modbus_get_float()` 可以直接按 IEEE 754 处理浮点数,支持 ABCD/DCBA/BADC/CDAB 四种바이트序。

**传输모드**:RTU + TCP 全支持。同一套 API,`modbus_new_rtu()` 创建시리얼 포트上下文,`modbus_new_tcp()` 创建 TCP 上下文,之后读写인터페이스完全一样。

**마스터/슬레이브**:都支持。TCP 슬레이브用 `modbus_tcp_listen()` + `modbus_tcp_accept()`,和写 Linux socket 服务端一个套路。

**코드 예제**——读슬레이브 1 的유지 레지스터 0x0000,返回 1 个 16 位值:

#include <modbus.h>
#include <stdio.h>

int main() {
    modbus_t *ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
    modbus_set_slave(ctx, 1);
    modbus_connect(ctx);
    uint16_t val;
    modbus_read_registers(ctx, 0, 1, &val);
    printf("회원가입 0 = %dn", val);
    modbus_close(ctx);
    modbus_free(ctx);
}

**已知문제**: - `modbus_connect()` 的语义容易踩坑。RTU 모드下调的是 `열기()` 시리얼 포트 열기,TCP 모드下调的是 `connect()` 连服务器。TCP 슬레이브모드不需要也不能调 `modbus_connect()`,而是用 `modbus_tcp_listen()`。搞混了连不上还不知道为什么 - `modbus_free()` 之后指针不会自动置空。如果你在循环里重连,先 free 再 new,不手动 `ctx = NULL` 的话,偶尔会指向已释放的内存,表现为随机崩溃或疯狂重连。这个我吃过亏 - 线程不安全。一个 `modbus_t*` 上下文不能被两个线程同时操作,得自己加锁 - Windows 下시리얼 포트名是 `\\.\COM10` 这种형식,Linux 是 `/dev/ttyUSB0`,跨平台编译要注意

**문서**:官网 libmodbus.org 有一套 manual page 风格的문서,外加 mkdocs 在线版。清晰但没什么예제项目,就 `tests/` 目录下那几个。

pymodbus —— Python 生态的事实표준

GitHub: https://github.com/pymodbus-dev/pymodbus

pymodbus 是目前维护最活跃的 Modbus 库,没有之一。pymodbus-dev 组织接手后,3.x 重写了异步架构,支持 asyncio,还在持续发版。2024 年底最新的稳定版是 v3.6.x。

**기능 코드**:全支持。01/02/03/04/05/06/15/16/22/23,连 43(读设备识别)都有。

**传输모드**:RTU + TCP + TLS。TLS 支持是 pymodbus 3.x 新加的,可以直接跑 `modbus+tls://`。ASCII 모드也支持但在 3.x 里被기호为废弃。

**마스터/슬레이브**:都支持,而且支持同步和异步两种 API。슬레이브可以跑一个完整的模拟器——`pymodbus.simulator` 能从 JSON 설정文件启动一个带多块레지스터的虚拟设备,上位机개발디버깅的时候非常好用。

**코드 예제**——同步모드读一个유지 레지스터:

from pymodbus.client import ModbusSerialClient

client = ModbusSerialClient(port="/dev/ttyUSB0", baudrate=9600)
client.connect()
rr = client.read_holding_registers(주소=0, count=1, slave=1)
print(rr.registers[0])
client.close()

异步版稍微多几行,用 `async with` 上下文管理器,配合 asyncio 跑。

**已知문제**: - 2.x 到 3.x 的 API 变化巨大。`pymodbus.client.sync.ModbusSerialClient` 变成了 `pymodbus.client.ModbusSerialClient`,`read_holding_registers` 返回值从 `ReadHolding회원가입sResponse` 变成了 `ModbusResponse`。如果你在网上搜到的예제代码用的是 `from pymodbus.client.sync import ...`,那肯定是 2.x 的,别直接抄 - 同步모드和异步모드不能混用。同一个进程里如果已经跑了 asyncio event loop,同步클라이언트会阻塞事件循环导致超时 - RTU 모드下시리얼 포트超时설정比较敏感。默认的 3 秒超时对于低速设备(4800bps)可能不够,需要自己调到 5-10 秒 - pip 安装时 `pip install pymodbus`,不是 `pymodbus3` 或 `pymodbus2`,别装错了

**문서**:readthedocs 上有完整的문서,`examples/` 目录下有几十个예제스크립트。没有중국어문서,但英文很清晰。

NModbus —— .NET 平台的唯一严肃选择

GitHub: https://github.com/NModbus/NModbus

NModbus 的历史有点绕。最早的 NModbus 是 Google Code 上(对,就是那个 Google Code)的一个项目,后来迁移到 GitHub 变成 NModbus4,再后来 NModbus4 也停更了。现在的 NModbus/NModbus 是 NModbus4 的继任者,维护者 rquackenbush,活跃개발中,nuget 包名 `NModbus`,最신버전 3.0.x,支持 .NET 6+。

**기능 코드**:01/02/03/04/05/06/15/16 全支持。22 和 23 需要自定义기능 코드处理。

**传输모드**:RTU、ASCII、TCP、UDP 全支持。시리얼 포트通过 `NModbus.Serial` 包,支持 Windows/Linux。

**마스터/슬레이브**:都支持。슬레이브支持自定义데이터存储,可以把레지스터 매핑到内存、데이터库甚至 PLC。

**코드 예제**——TCP 마스터读一个레지스터:

using NModbus;

var client = new TcpClient("192.168.1.100", 502);
var factory = new ModbusFactory();
var master = factory.CreateMaster(client);
ushort[] result = master.ReadHolding회원가입s(1, 0, 1);
Console.WriteLine(result[0]);

**已知문제**: - 시리얼 포트支持依赖 `System.IO.Ports`,Linux 上需要额外설정权限 - `Slave데이터Store` 在多线程下不是线程安全的,高并发读写时要自己加锁 - 异步 API(`ReadHolding회원가입sAsync`)返回 `Task`,但底层 I/O 实际上是同步的,没有真正的 async I/O

**문서**:README 够用,`Samples/` 目录有几个예제。主要靠 Stack Overflow 上的老帖子。

jamod —— Java 生态的「前辈」,但建议你别用

SourceForge: https://sourceforge.net/projects/jamod/ GitHub (열기HAB fork): https://github.com/열기hab/jamod

jamod 是 Dieter Wimberger 在 2002 年写的,比在座很多엔지니어링师的工龄都长。最后一次实质性更新是 2010 年,之后基本就没有了。열기HAB 社区 fork 了一个버전修了几个 bug 给自己用,但那个 fork 也只是被动维护。

如果你现在新开一个 Java 项目要做 Modbus,直接跳过 jamod,看 j2mod(GitHub: steveohara/j2mod)。j2mod 是 jamod 的重写버전,Apache 2.0 许可,Java 8+,还在更新(2024 年 7 月最后一次提交),RTU + TCP 全支持,마스터슬레이브都有。

但既然这篇글要覆盖 jamod,我还是写上。jamod 支持的기능 코드:01/02/03/04/05/06/15/16。传输모드 RTU + ASCII + TCP。시리얼 포트통신依赖 `javax.comm`(巨古老的 API,JDK 都不自带了),替代方案是 RXTX 或 jSerialComm。

코드 예제:

import net.wimpi.modbus.Modbus;
import net.wimpi.modbus.io.ModbusTCPTransaction;
import net.wimpi.modbus.msg.ReadInput회원가입sRequest;
import net.wimpi.modbus.msg.ReadInput회원가입sResponse;
import net.wimpi.modbus.net.TCPMasterConnection;
import java.net.Inet주소;

TCPMasterConnection conn = new TCPMasterConnection(
    Inet주소.getBy이름("192.168.1.100"));
conn.connect();
ReadInput회원가입sRequest req = new ReadInput회원가입sRequest(0, 1);
ModbusTCPTransaction trans = new ModbusTCPTransaction(conn);
trans.setRequest(req);
trans.execute();
ReadInput회원가입sResponse res = (ReadInput회원가입sResponse) trans.getResponse();
System.out.println(res.get회원가입Value(0));
conn.close();

「已知문제」这个词对 jamod 来说太轻了,它本身就是个문제。但如果你维护的是 2012 年的老系统,又不得不用它,那 열기HAB 的 fork 比原版靠谱。

modbus-tk —— 快速原型的好帮手

GitHub: https://github.com/ljean/modbus-tk

法国人 Luc Jean 写的,名字里的 tk 是 TestKit 的缩写——定位非常明确:测试도구。不是给生产환경用的。但实际上很多人拿它做了生产,因为它确实简单。

**기능 코드**:01/02/03/04/05/06/15/16。不支持 22/23。

**传输모드**:RTU + TCP。ASCII 不支持。

**마스터/슬레이브**:都支持。슬레이브可以很方便地 `add_slave` + `add_block` 创建模拟设备。内置一个 hook 函数机制,可以在收到读写请求时插入自定义逻辑——这个设计很聪明,写测试스크립트的时候可以直接在 hook 里注入故障시나리오。

**코드 예제**——RTU 마스터读레지스터:

import serial
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu

master = modbus_rtu.RtuMaster(
    serial.Serial(port="/dev/ttyUSB0", baudrate=9600))
val = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 1)
print(val[0])

**已知문제**: - 最后更新在 2020 年左右,bug fix 基本靠社区 PR。Python 3.12 的兼容性可能有문제 - 没有异步支持,所有操作都是同步阻塞的 - 浮点数没有内置辅助,你得自己 `struct.pack/unpack` - 마스터 `execute()` 方法的超时行为不太可控,底层依赖 pyserial 的超时,遇到无响应的슬레이브可能卡很久

**문서**:`examples/` 目录里几个예제就是전체문서了。好在代码量小,花十分钟就能看完。

QtModbus —— Qt 개발者的原生方案

这不是一个「库」,是 Qt 官方 `qtserialbus` 模块的一部分。Qt 5.8 引入,现在是 Qt 6 的标配模块。

因为是 Qt 官方的,API 设计完全是 Qt 风格:信号槽、事件循环、`QModbusReply`。跨平台天然支持——同一套代码在 Windows、Linux、macOS、嵌入式 Linux(Boot2Qt)上都能跑。

**기능 코드**:通过 `QModbus데이터Unit::회원가입Type` 枚举支持所有표준유형:Coils、DiscreteInputs、Input회원가입s、Holding회원가입s。底层可以发自定义기능 코드。

**传输모드**:只有 TCP(`QModbusTcpClient` / `QModbusTcpServer`)。**没有 RTU**。这是一个重要的限制——Qt 官方没有内置 Modbus RTU 支持,你得用 `QSerialPort` 自己在적용层写 RTU 帧분석,或者找第三方实现。有些개발者用 `QModbusRtuSerialMaster`(一个社区项目)来填补这个空缺。

**마스터/슬레이브**:都支持。TCP 슬레이브可以通过 `QModbusTcpServer` 实现,自定义데이터映射到 `QModbusServer` 的회원가입表。

**코드 예제**——TCP 클라이언트读一个레지스터:

#include <QModbusTcpClient>
#include <QModbus데이터Unit>

auto client = new QModbusTcpClient(this);
client->setConnectionParameter(
    QModbusDevice::Network주소Parameter, "192.168.1.100");
client->setConnectionParameter(
    QModbusDevice::NetworkPortParameter, 502);
client->connectDevice();

QModbus데이터Unit unit(QModbus데이터Unit::Holding회원가입s, 0, 1);
auto *reply = client->sendReadRequest(unit, 1);
connect(reply, &QModbusReply::finished, this, [reply]() {
    qDebug() << reply->result().values().at(0);
});

异步的,用信号槽연결结果。注意 `sendReadRequest` 返回的 `QModbusReply*` 生命周期归 Qt 管理,别手动 delete。

**已知문제**: - 没有 RTU,这是最大的一个。你没看错,Qt 官方的 Modbus 模块没有 RTU - 연결断开后不会自动重连,你得在 `stateChanged` 信号里自己写重连逻辑 - `QModbusTcpServer` 的 TCP 연결数有上限,默认是 1。要通过 `setMaxClients()` 改 - 许可문제:Qt 是 LGPL/GPL 双许可,商业闭源项目需要买 Qt Commercial License

**문서**:Qt 官方문서一流。예제项目在 Qt Creator 欢迎页就能找到。

新手推荐路径

别纠结了,按你的기술栈选:

- **STM32 裸机 / FreeRTOS** → FreeModbus。你没别的选择,它就是표준答案。移植花半天,调通 3.5T 定时器再加半天,之后就不用管了 - **Linux 산업 제어机 / 게이트웨이(C)** → libmodbus。如果是树莓派跑 Debian 做 Modbus 게이트웨이,libmodbus + MQTT 桥接是经典方案。`libmodbus` 采集,`mosquitto` 上云 - **Python 上位机 / 测试스크립트** → pymodbus。pymodbus.simulator 仿真 + pymodbus client 读写,一个스크립트搞定设备디버깅。配合 pytest 可以做 Modbus 自动化测试 - **C# WinForm / WPF 上位机** → NModbus。NuGet 安装,三行代码开始读레지스터。配合 ScottPlot 做实时曲线,工厂里最常见的기술栈组合 - **Qt 跨平台桌面적용** → QtModbus。如果你的적용已经用了 Qt,别引入额外的 C 库依赖,直接用 Qt 官方的 - **Java 企业系统(新项目)** → 不要用 jamod。用 j2mod(GitHub: steveohara/j2mod),它是 jamod 的现代化重写,API 清晰得多 - **快速验证想法** → modbus-tk。三分钟搭一个슬레이브模拟器,验证레지스터 매핑对不对,然后切到 pymodbus 做正式的

经典组合方案

**「FreeModbus 슬레이브 + pymodbus 上位机测试」**:嵌入式设备跑 FreeModbus 做슬레이브,개발阶段用 Python 写 pymodbus 스크립트读写레지스터做功能验证。比用 Modbus Poll 灵活——你能在스크립트里加데이터체크섬、边界测试、压力测试。调通之后,再换成真正的上位机(C# 或 Qt)。

**「libmodbus 게이트웨이 + pymodbus 설정도구」**:산업 제어机跑 libmodbus 对接下面几十台 Modbus RTU 设备,데이터收集后转 MQTT 上云。Web 后台用 pymodbus 做设备매개변수读写——不要求实时性,Python 的개발效率碾压一切。

**「QtModbus 做界面 + libmodbus 做底层」**:Qt 写跨平台桌面 SCADA,人机交互和图表用 Qt Charts,但 Modbus 통신不直接用 QtModbus(因为没有 RTU),而是通过 libmodbus 的 C API 做底层采集,Qt 只负责显示。这个组合在厂区监控系统里很常见。

避坑清单

**第一坑:FreeModbus 的 3.5T 定时器**

Modbus RTU 프로토콜规定帧与帧之间至少间隔 3.5 个문자时间。통신 속도 9600 时一个문자大약 1ms,3.5T ≈ 3.5ms。很多人移植时直接把定时器设成 3.5ms 周期中断。错了。FreeModbus 的 3.5T 定时器用法是:每收到一个바이트就重置定时器,如果定时器溢出(설명 3.5T 内没有新바이트),则认为一帧종료。所以定时器要设成单次모드,不是周期모드。在收到바이트的中断里调 `vMBPortTimersEnable()` 重新启动定时器。

통신 속도不同时 3.5T 对应的时间不同:9600bps → ~3.65ms,19200bps → ~1.83ms,115200bps → ~304μs。115200 下 3.5T 只有 300 微秒左右,如果你的定时器最小粒度是 1ms,校准不了那么精细,帧间隔检测就会出错。这时候要么降통신 속도到 38400,要么用硬件定时器的고정밀모드。

**第二坑:libmodbus 的 connect vs new_tcp vs listen 语义**

`modbus_new_tcp("192.168.1.100", 502)` 创建上下文,但还没연결。 `modbus_connect(ctx)` 在 RTU 모드下시리얼 포트 열기,在 TCP 마스터모드下 connect 到服务器。 TCP 슬레이브모드不要调 `modbus_connect()`,而是 `modbus_tcp_listen(ctx, 1)` + `modbus_tcp_accept(ctx, &socket)`。

最常见的错误:写 TCP 슬레이브的时候习惯性调了 `modbus_connect()`,然后发现怎么都收不到마스터的请求。因为 `connect()` 是去连别人,不是等别人来连你。

另外一个坑:`modbus_free(ctx)` 之后 `ctx` 指针还在。如果你要在循环里重连(比如네트워크断了又恢复),必须先 `ctx = NULL` 再 `modbus_new_tcp()`,否则有概率访问已释放的内存。Wireshark 抓包会看到 TCP SYN 疯狂重发几万次——那是 `modbus_connect()` 在访问野指针。

**第三坑:pymodbus 同步 vs 异步모드混用**

pymodbus 3.x 有两套클라이언트 API:同步的 `ModbusSerialClient` / `ModbusTcpClient`,异步的 `AsyncModbusSerialClient` / `AsyncModbusTcpClient`。

如果你在一个已经有 asyncio 事件循环的进程里用同步클라이언트,底层的 socket I/O 会阻塞事件循环,导致所有异步任务暂停。反过来,在纯同步스크립트里用异步클라이언트,`await` 语法会报错。

规则很简单:要么全同步,要么全异步。测试스크립트一般用同步就够了。生产환경如果是一个进程要同时连几十台设备,必须用异步모드,不然一个设备超时拖着其他 49 个一起等。

**第四坑:바이트序문제——不是库的锅,但每次都是坑**

Modbus 프로토콜本身只定义了 16 位레지스터的传输형식——大端(Big-Endian),高바이트在前。但当你用两个레지스터传一个 32 位浮点数时,谁在前谁在后,프로토콜没说。不同厂商的处理방식不一样:

- 施耐德 PLC 用大端双字(ABCD):레지스터 N 存高 16 位,N+1 存低 16 位 - 西门子 S7-1200 用바이트交换后的형식(CDAB 或 BADC) - 有些国产仪表用纯小端(DCBA)

libmodbus 提供了 `modbus_set_float()` 和四种바이트序常量,pymodbus 有 `BinaryPayloadDecoder` 可以指定바이트序,FreeModbus 什么都没有——自己用 `union` 或者 `memcpy` 拼。

血的教训:调了两天发现온도读数是个天文数字,最后是바이트序反了。先确认对方设备的手册上有没有写 Float 的存放형식。如果没写,读两个레지스터自己拼,换四种排列总有一个是对的。

**第五坑:广播주소 0 的坑**

Modbus 规定주소 0 是广播주소,마스터发广播帧,所有슬레이브执行但不回复。但实际上很多슬레이브设备根本不支持广播,发주소 0 过去直接没反应。还有的设备虽然支持广播但不全支持——06(写单个레지스터)广播能执行,16(写多个레지스터)广播就忽略。

如果你在用 `libmodbus_set_slave(ctx, 0)` 发广播,别指望有回复。`modbus_read_registers()` 在广播모드下的行为是未定义的。

选型决策速查

如果你不想看上面洋洋洒洒几千字,这里有个决策树:

1. 目标平台是 MCU 裸机 → FreeModbus 2. 目标平台是 Linux → libmodbus 3. 你用 Python → pymodbus 4. 你用 C# / .NET → NModbus 5. 你用 Qt → QtModbus(TCP 시나리오)或 libmodbus(RTU 시나리오) 6. 你用 Java 新项目 → j2mod,别碰 jamod 7. 你只是要快速搭个测试 → modbus-tk,验证完切 pymodbus

所有库我都贴了最小可运行예제,복사粘贴改一下设备주소就能跑。통신调不通的时候,先拿 Modbus Poll 或 pymodbus 搭个纯软件环回确认硬件链路没문제,再怀疑프로토콜栈的 bug。

有문제到 modbus.cn 论坛聊。

실제 프로젝트에 이 자료를 활용하시겠습니까?

도구 센터에서 프레임 분석, CRC 검증, 장비 디버깅을 진행하거나 요청을 제출하여 선정 및 연동 제안을 받아보세요.

엔지니어 회원

이 글을 실행 가능한 디버깅 자료로 활용하세요

가입하면 고급 프레임 분석, 자료 패키지 다운로드, 코드 예제, 엔지니어링 사례, 우선 기술 지원을 이용할 수 있어 실제 프로젝트 납품에 적합합니다.

고급 도구 무제한 이용
자료 패키지와 코드 패키지
완전한 엔지니어링 사례 라이브러리
우선 기술 지원 채널

답글 작성

이메일 주소는 공개되지 않습니다. 必填项已用 * 标注