static int32_t modbus_find_pdu_len()

in IndustrialDeviceController/Software/HighLevelApp/drivers/modbus/modbus_transport_rtu.c [129:204]


static int32_t modbus_find_pdu_len(uint8_t *pdu)
{
    // it's error response, pdu is two bytes
    if (pdu[0] & 0x80) {
        return 2;
    }

    int32_t length = 0;

    switch (pdu[0]) {
    case FC_READ_COILS:
    case FC_READ_DISCRETE_INPUTS:
    case FC_READ_HOLDING_REGISTERS:
    case FC_READ_INPUT_REGISTERS:
        // 1 byte function code + 1 byte byte count + n bytes values
        length = 2 + pdu[1];
        break;

    case FC_WRITE_COILS:
    case FC_WRITE_HOLDING_REGISTERS:
    case FC_WRITE_SINGLE_COIL:
    case FC_WRITE_SINGLE_REGISTER:
        // 1 byte function code + 2 bytes start addr, 2 byte quantity
        length = 5;
        break;

    case FC_READ_EXCEPTION_STATUS:
        // 1 byte function code + 1 byte output data
        length = 2;
        break;

    case FC_DIAGNOSTICS:
        // 1 byte function code, 2 byte sub-function , 2 bytes data
        length = 5;
        break;

    case FC_GET_COMM_EVENT_COUNTER:
        // 1 byte function code, 2 byte status, 2 bytes event count
        length = 5;
        break;

    case FC_GET_COMM_EVENT_LOG:
        length = 2 + pdu[1];
        break;

    case FC_REPORT_SERVER_ID:
        length = 5;
        break;

    case FC_READ_FILE_RECORD:
    case FC_WRITE_FILE_RECORD:
        length = 2 + pdu[1];
        break;

    case FC_MASK_WRITE_REGISTER:
        length = 7;
        break;

    case FC_READ_WRITE_REGISTERS:
        length = 2 + pdu[1];
        break;

    case FC_READ_FIFO_QUEUE:
        length = 2 + pdu[1];
        break;

    case FC_MEI:
        // FC_MEI is not supported now as the pdu lenth cann't be found
        // in pdu and not fixed.
    default:
        length = -1;
        break;
    }

    return length;
}