Modbus RTU 串口的协议

表格

字段 长度 含义 大白话解释
起始间隙 ≥3.5 字符时间 帧开始标记 总线空这么久了,设备就知道 “新报文要来了”
设备地址 8 位(1 字节) 从站 ID 告诉总线:这条消息是发给哪个设备的(0~247)
功能代码 8 位(1 字节) 要做什么操作 比如 01 读线圈、03 读保持寄存器、04 读输入寄存器
数据 N×8 位(N 字节) 操作的具体参数 比如 “从地址 0 开始读 1 个寄存器” 的地址和数量
CRC 校验 16 位(2 字节) 数据校验 防传输错误,设备收到后会重新计算校验码,不对就丢弃
停止间隙 ≥3.5 字符时间 帧结束标记 总线又空了这么久,设备就知道 “这一帧发完了”

先看操作码 Modbus 协议的 “操作说明书”

① 读线圈状态(01)bit

你可以把它理解成:查开关的状态。线圈就是我们之前说的 “数字量输出(DO)”,比如 LED、蜂鸣器、继电器。功能码01就是让设备告诉你:“我这几个开关,现在是开还是关?”比如你想确认 LED 灯有没有被点亮,就发这个指令。


② 读离散输入状态(02)bit

理解成:查按钮的状态。离散输入就是 “数字量输入(DI)”,比如接的按钮、开关、接近传感器。功能码02就是让设备告诉你:“我这几个按钮,现在是按下还是松开?”比如你接了个按键,想知道用户有没有按它,就用这个指令。


③ 写单个线圈(05)、写多个线圈(15)bit

理解成:控制开关。

  • 05:只控制一个开关,比如 “把 LED1 打开”
  • 15:一次控制多个开关,比如 “把 LED1、LED2、蜂鸣器都关掉”
  •  modbus_write_bit,底层就是用的功能码05,来控制 LED 亮灭的。

④ 读保持寄存器(03)16bit

理解成:读设备里存的 “参数”。保持寄存器里存的是设备的可配置参数,比如 PID 控制器的参数、报警上下限、设备地址等。功能码03就是让设备把这些设定好的参数发给你,你可以读出来看看对不对。


⑤ 读输入寄存器(04)16bit

理解成:读传感器的实时数据。输入寄存器里存的是设备实时采集的原始数据,比如温湿度、电压、电流。功能码04就是让设备把这些传感器数据发给你。你之前读温湿度的代码,用的就是这个功能码!


⑥ 写单个保持寄存器(06)、写多个保持寄存器(16)16bit

理解成:给设备 “设置参数”。

  • 06:只改一个参数,比如 “把温度报警上限设为 50℃”
  • 16:一次改多个参数,比如 “把 PID 的 P、I、D 三个参数都改掉”这些参数写进去后,设备就会按你设定的新值运行。

一句话总结

表格

功能码 操作对象 用途 你的场景例子
01 线圈(输出) 读开关状态 确认 LED 灯是否点亮
02 离散输入 读按钮 / 传感器状态 读按键是否按下
05/15 线圈(输出) 控制开关 点亮 / 熄灭 LED、蜂鸣器
03 保持寄存器 读设备参数 读 PID 参数、报警值
04 输入寄存器 读传感器数据 读温湿度、电压电流
06/16 保持寄存器 设置设备参数 修改报警上下限、设备地址
  • 控制 LED / 蜂鸣器:用的是写线圈(05)
  • 读温湿度:用的是读输入寄存器(04)

传感器点位

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐