# Modbus RTU最大长度ADU测试 串口助手请选择HEX发送。下列报文已经完整展开,可以直接复制。 测试条件: - 从站地址为`0x01` - 先执行0x0F写线圈,再执行0x01读线圈 - 先执行0x10写保持寄存器,再执行0x03读保持寄存器 - 0x10和0x03使用D6000起始地址,避免覆盖掉电保持区和通信历史区 - 文档中的全零读取响应以相关线圈和保持寄存器初始值均为0为前提 - 0x0F一次最多写1968个线圈,不能单次清零全部2000个待读线圈;测试0x01前还应确认线圈1968~1999为0 - 0x10一次最多写123个寄存器,不能单次清零全部125个待读寄存器;测试0x03前还应确认D6123~D6124为0 ## 0x0F写入1968个线圈 含义: - `01`:从站地址 - `0F`:写多个线圈功能码 - `00 00`:起始线圈地址0 - `07 B0`:写入数量1968 - `F6`:后续线圈数据长度246字节 - 连续246个`00`:将线圈0~1967全部写为OFF - `A6 FE`:CRC低字节、CRC高字节 - 测试目的:用255字节合法请求帧检查DMA接收缓冲区边界和最大线圈写入数量 请求帧长度:255字节 请求帧: ```text 01 0F 00 00 07 B0 F6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A6 FE ``` 预期响应帧长度:8字节 预期响应帧: ```text 01 0F 00 00 07 B0 56 4F ``` ## 0x01读取2000个线圈 含义: - `01`:从站地址 - `01`:读线圈功能码 - `00 00`:起始线圈地址0 - `07 D0`:读取数量2000 - `3F A6`:CRC低字节、CRC高字节 - 响应中的`FA`表示后续包含250字节线圈状态,因为`2000 ÷ 8 = 250` - 响应中的250个`00`表示线圈0~1999全部为OFF - `F5 AF`:全零响应对应的CRC低字节、CRC高字节 - 测试目的:检查最大线圈读取数量以及255字节响应帧的DMA发送 请求帧长度:8字节 请求帧: ```text 01 01 00 00 07 D0 3F A6 ``` 预期响应帧长度:255字节 预期响应帧: ```text 01 01 FA 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F5 AF ``` ## 0x10写入123个保持寄存器 含义: - `01`:从站地址 - `10`:写多个保持寄存器功能码 - `17 70`:起始地址6000,即D6000 - `00 7B`:写入数量123 - `F6`:后续寄存器数据长度246字节 - 连续246个`00`:将D6000~D6122全部写为0 - `76 06`:CRC低字节、CRC高字节 - 正常响应回显起始地址`17 70`和写入数量`00 7B` - 测试目的:用255字节合法请求帧检查DMA接收缓冲区边界和最大寄存器写入数量 请求帧长度:255字节 请求帧: ```text 01 10 17 70 00 7B F6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 76 06 ``` 预期响应帧长度:8字节 预期响应帧: ```text 01 10 17 70 00 7B 84 45 ``` ## 0x03读取125个保持寄存器 含义: - `01`:从站地址 - `03`:读保持寄存器功能码 - `17 70`:起始地址6000,即D6000 - `00 7D`:读取数量125 - `81 84`:CRC低字节、CRC高字节 - 响应中的`FA`表示后续包含250字节寄存器数据,因为`125 × 2 = 250` - 响应中的250个`00`表示D6000~D6124全部为0 - `08 E8`:全零响应对应的CRC低字节、CRC高字节 - 测试目的:检查最大保持寄存器读取数量以及255字节响应帧的DMA发送 请求帧长度:8字节 请求帧: ```text 01 03 17 70 00 7D 81 84 ``` 预期响应帧长度:255字节 预期响应帧: ```text 01 03 FA 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 E8 ``` ## 检查项 - 0x0F和0x10请求的`ModbusRxFrameLength`应为255 - 0x01和0x03正常响应的`responseLength`应为255 - `droppedFrameCount`不应增加 - `uartErrorCount`不应增加 - 不应发生HardFault、DMA越界或接收停止 - 完成255字节帧后,下一帧仍应正常通信