11#if DETWS_ENABLE_MODBUS_MASTER
13size_t modbus_build_read(uint8_t fc, uint16_t txid, uint8_t unit, uint16_t start, uint16_t count, uint8_t *out,
18 if (fc != 0x03 && fc != 0x04)
20 if (count < 1 || count > 125)
24 out[0] = (uint8_t)(txid >> 8);
25 out[1] = (uint8_t)(txid & 0xFF);
33 out[8] = (uint8_t)(start >> 8);
34 out[9] = (uint8_t)(start & 0xFF);
35 out[10] = (uint8_t)(count >> 8);
36 out[11] = (uint8_t)(count & 0xFF);
40int modbus_parse_response(
const uint8_t *adu,
size_t len, uint16_t *regs_out,
size_t max_regs, uint8_t *exception_out)
46 if (adu[2] != 0 || adu[3] != 0)
53 *exception_out = adu[8];
56 if (fc != 0x03 && fc != 0x04)
59 uint8_t byte_count = adu[8];
60 if ((byte_count & 1) || len < (
size_t)(9 + byte_count))
63 int nregs = byte_count / 2;
65 for (
int i = 0; i < nregs && (size_t)i < max_regs; i++)
68 regs_out[i] = (uint16_t)((adu[9 + i * 2] << 8) | adu[9 + i * 2 + 1]);
Modbus TCP master codec + register scanner (DETWS_ENABLE_MODBUS_MASTER).