c++如何解析常用的Modbus-RTU协议二进制帧格式【进阶】

夏磊小哥_9707

夏磊小哥_9707

2026-04-20

709人浏览

原创

modbus-rtu帧拆解需缓存+crc校验+3.5t静默超时双重判定;crc16用0xa001查表法,输入不含crc;解析0x03/0x04响应须先判异常码(功能码&0x80),再依byte_count/2得寄存器数。

c++如何解析常用的modbus-rtu协议二进制帧格式【进阶】

Modbus-RTU帧结构怎么拆解才不丢字节

Modbus-RTU不是“发一串字节就完事”,它依赖严格的帧边界判断:起始静默时间 ≥3.5T(T为1字符传输时间),结尾静默时间同样 ≥3.5T。但实际串口接收时,read() 或 serial_port::read_some() 往往分多次返回数据,导致一个完整帧被切成两段——比如先收到前6字节,后收到剩下5字节。直接按固定长度(如最小帧长8字节)截取会出错。

正确做法是缓存未完成帧,并基于 CRC 校验 + 静默超时双重判定:

  • 维护一个 std::vector<uint8_t></uint8_t> 缓冲区,持续追加新读入字节
  • 每次追加后,从缓冲区头部开始扫描:找合法地址域(1–247)、功能码(0x01/0x03/0x04/0x06/0x10等)、再检查末尾2字节是否为该帧的 CRC16(小端排列)
  • 同时用系统时钟记录最后收到字节的时间,若当前时间 - 最后接收时间 > 3.5T(例如9600bps下约3.5ms),则认为上一帧已结束,剩余缓冲区内容可清空或告警

如何用C++跨平台计算Modbus CRC16(0xA001多项式)

Modbus RTU 使用 CRC-16-IBM(多项式 0xA001,初始值 0xFFFF,无反转、无异或输出),和常见 Linux cksum 或 Qt 的 QCryptographicHash 不兼容。手写错误率高,尤其字节序和异或时机容易搞反。

推荐直接实现标准查表法(快且确定):

static constexpr uint16_t modbus_crc16(const uint8_t* data, size_t len) {
    static const uint16_t table[256] = {
        0x0000, 0xC0C1, 0xC181, 0x0140, /* ... 省略,共256项,可生成或复制权威表 */
    };
    uint16_t crc = 0xFFFF;
    for (size_t i = 0; i > 8) ^ table[idx];
    }
    return crc;
}

注意:data 指针必须指向不含 CRC 的原始帧(即地址+功能码+数据域),长度 len 也不含末尾2字节。校验时,把整帧(含CRC)传入,结果应为 0x0000 才合法。

C++
C++

"空空如也"

下载

解析0x03/0x04读寄存器响应时,数据长度字段怎么用

功能码 0x03(读保持寄存器)和 0x04(读输入寄存器)响应帧格式为:[addr][0x03][byte_count][data...][crc_lo][crc_hi]。其中 byte_count 是后续数据字节数(不是寄存器个数),而每个寄存器占2字节、大端存储。

常见误判:看到 byte_count == 4 就以为是2个寄存器,却忽略它可能来自异常响应(此时 byte_count 实际是功能码 | 0x80,比如 0x83)。所以必须先确认功能码是否带异常标志:

  • 收到响应首字节为设备地址,第二字节为功能码 → 若该字节 & 0x80,则为异常响应,byte_count 实际是异常码,后面只有1字节,无需继续解析数据
  • 否则才是正常响应,byte_count 有效,且必须为偶数;寄存器数量 = byte_count / 2
  • 解析数据时,用 uint16_t reg = (data[i] 提取每个寄存器值,不能直接 memcpy 到 <code>uint16_t[](大小端风险)

为什么用 std::vector 而不用 char[] 处理 Modbus 帧

Modbus 帧本质是二进制流,含大量 0x00 字节。char 在某些平台默认有符号,当某字节为 0xFF 时,若被当 signed char 读取再转 int,会扩展成 0xFFFFFFFF 而非 0x00FF,导致 CRC 计算或地址比对失败。

更关键的是内存管理:串口接收节奏不可控,帧长动态变化(最短 8 字节,最长可达 256+ 字节)。用定长 char buf[256] 容易溢出,而 std::vector<uint8_t></uint8_t> 可安全 resize,且 uint8_t 明确无符号语义,所有位运算、比较、CRC 输入都稳。

另外,C++20 起可配合 std::span<const uint8_t></const> 传递子帧视图,避免拷贝,但前提是确保底层 vector 生命周期足够长。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2148

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

959

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

387

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

307

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

366

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

560

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1177

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1305

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习