Modbus RTU 报文说明 1. 请求帧(MCU → Noris AMS) 发送示例:01 03 04 88 00 01 C5 D3 字节偏移 值 含义 0 01 从站地址 = 1 1 03 功能码 = Read Holding Registers 2-3 04 88 寄存器起始地址 = 0x0488 = 1160(对应 Noris 41161) 4-5 00 01 读取数量 = 1 个寄存器 6-7 C5 D3 CRC16-Modbus 校验(低字节在前) 帧长度:8 字节 发送间隔:每 1000ms 发送一次 发送方式:HAL_UART_Transmit() 阻塞发送,@19200bps 约 4.2ms 2. 正常响应帧(Noris AMS → MCU) 示例:01 03 02 00 F0 B8 47 字节偏移 值 含义 0 01 从站地址 = 1 1 03 功能码 = 03(正常响应) 2 02 数据字节数 = 2(1个寄存器×2字节) 3-4 00 F0 寄存器值 = 0x00F0(大端序) 5-6 B8 47 CRC16-Modbus 校验 帧长度:7 字节 3. 寄存器值 → 报警映射 寄存器 41161 值为 0x00F0 时(Bit4-7 全为 1): Bit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 ↑ ↑ ↑ ↑ │ │ │ └─ Bit4: 火灾综合报警 (Fire) │ │ └──── Bit5: 水密门综合报警 (Door) │ └─────── Bit6: 舱底水综合报警 (Bilge) └────────── Bit7: 气体检测综合报警 (Gas) 提取后映射到紧凑报警字节: 位 1-based偏移 0-based偏移 Bit5 (手册) >>4 >>5 Bit6 (手册) >>5 >>6 Bit7 (手册) >>6 >>7 Bit8 (手册) >>7 >>8xian 当前代码按 1-based 偏移 4/5/6/7 实现。 4. 报警状态 → RF433 数据包 4a. 变化通知包(Type 0x4D) 报警状态变化时立即发送: 示例:AA 4D 03 69 0F [SUM] 字节 值 含义 0 AA 帧头 1 4D 协议类型 = Modbus RTU 报警 2 03 LEN = ID(1) + Payload(1) + SUM(1) 3 69 设备ID = 105 4 0F 报警状态字节(见下表) 5 SUM Sum8 校验和 报警字节 0x0F 各位含义: Bit: 7 6 5 4 3 2 1 0 0 0 0 0 1 1 1 1 ↑ ↑ ↑ ↑ │ │ │ └─ 火灾报警 │ │ └──── 水密门报警 │ └─────── 舱底水报警 └────────── 气体检测报警 4b. 心跳包(Type 0xAA,扩展后 8 字节载荷) 示例:AA AA 0A 69 [Seq_H] [Seq_L] [FW_H] [FW_L] [IO] [TCP_H] [TCP_L] [RTU] [SUM] 字节偏移 含义 说明 0 AA 帧头 1 AA 协议类型 = 心跳 2 0A LEN = 10 3 69 设备ID = 105 4-5 Seq 序列号(16-bit 大端) 6-7 FW 固件版本码 8 IO IO状态(Bit0-3=DI1-4, Bit7=网口连接) 9-10 TCP Modbus TCP 最后寄存器值 11 RTU Modbus RTU 报警状态(新增) 12 SUM Sum8 校验和 5. 异常响应帧(参考) 如果从站返回异常: 01 83 02 C0 F1 字节 值 含义 0 01 从站地址 1 83 功能码 + 0x80(异常标志) 2 02 异常码 = 02(非法寄存器地址) 3-4 CRC 校验 当前代码:异常响应的 FC ≠ 0x03,会被 parse_modbus_response() 的 mb_rx_buf[1] != 0x03 判断拦截,静默丢弃。 6. 时序图 时间轴 (ms) 0 1000 2000 3000 │ │ │ │ ├─ TX: 请求帧(8B, ~4ms) │ (发送后屏蔽回波10ms) ├─ RX: 响应帧(7B, ~3.6ms) ─┤ │ ├─ 解析+变化检测 │ ├─ 变化? → RF433发送 │ │ │ ├─ TX: 请求帧 │ ├─ RX: 响应帧 │ ├─ 解析 │ │ │ │ ├─ TX: 请求帧 │ │ ├─ 超时500ms无响应 │ │ ├─ 回IDLE,下次重试 │ │ │ ├─ TX: 请求帧 │ │ │ ├─ RX: 响应帧 │ │ │ ├─ 解析 每秒一个完整轮询周期:发送(~4ms) + 等响应(~10ms) + 解析(<1ms) ≈ 15ms,其余 985ms 空闲。