参考使用 Modbus RTU 0x15 写命令,作为通用文件传输协议。
平台将数据分包发送到DTU,DTU可以处理文件数据或者透传给串口。
为简化操作,本协议不要求设备回复确认时携带原文件数据。
| 序号 | 字段 | 数据长度(字节) | 值 (16进制) | 说明 |
|---|---|---|---|---|
| 1 | 设备地址 | 1 | 0x01 | 默认 0x01, 设备的 Modbus 地址 |
| 2 | 功能码 | 1 | 0x15 | 固定值 |
| 3 | 本包字节数 | 1 | 序号 4~8 的总字节数 | 范围十进制 7~244 |
| 4 | 子请求 | 1 | 0x06 | 固定值 |
| 5 | 文件总包数 | 2 | 0x---- | 根据文件大小和分包大小计算得出的包总数+1(最后追加一个校验包) |
| 6 | 本包序号 | 2 | - | 从 0 开始 |
| 7 | 本包写寄存器的个数 | 2 | N,N=64/或者计算得出 | 非最后包时,固定值64(一次传输128字节),最后一个数据包非满包发送时,根据剩余字节数/2计算得出 |
| 8 | 数据体 | N*2 | 文件内容片段 | |
| 9 | CRC | 2 | Modbus RTU CRC | 低字节在前 |
| 序号 | 字段 | 字节数 | 值 | 说明 |
|---|---|---|---|---|
| 1 | 设备地址 | 1 | 0x01 | 收到的下发数据对应字段 |
| 2 | 功能码 | 1 | 0x15 | 收到的下发数据对应字段 |
| 3 | 包字节数 | 1 | 序号 4~8 的总字节数 | 收到的下发数据对应字段 |
| 4 | 子请求 | 1 | 0x06 | 收到的下发数据对应字段 |
| 5 | 文件总包数 | 2 | 0x---- | 收到的下发数据对应字段 |
| 6 | 本包序号 | 2 | - | 收到的下发数据对应字段 |
| 7 | 本包写寄存器的个数 | 2 | 0 | 回复包中不要求携带数据体,也可以携带,携带数据时,需返回有效的寄存器个数 |
| 8 | 数据体 | N*2 | 文件内容片段 | 如果不携带数据体,无此部分数据 |
| 9 | CRC | 2 | Modbus RTU CRC | 低字节在前 |
校验数据生成方法: 从文件第一个字节开始累加到最后一个字节,赋值给无符号2字节整数,大端字节序(高字节在前)。
平台发送校验包示例: