diff --git a/umodbus/client/serial/rtu.py b/umodbus/client/serial/rtu.py index 4c01580..c94ed20 100644 --- a/umodbus/client/serial/rtu.py +++ b/umodbus/client/serial/rtu.py @@ -53,6 +53,7 @@ WriteSingleRegister, WriteMultipleCoils, WriteMultipleRegisters) from umodbus.utils import recv_exactly +from umodbus.exceptions import ModbusFrameError def _create_request_adu(slave_id, req_pdu): @@ -173,9 +174,9 @@ def write_multiple_registers(slave_id, starting_address, values): def parse_response_adu(resp_adu, req_adu=None): """ Parse response ADU and return response data. Some functions require - request ADU to fully understand request ADU. + request ADU to fully understand response ADU. - :param resp_adu: Resonse ADU. + :param resp_adu: Response ADU. :param req_adu: Request ADU, default None. :return: Response data. """ @@ -217,6 +218,10 @@ def send_message(adu, serial_port): response_error_adu = recv_exactly(serial_port.read, exception_adu_size) raise_for_exception_adu(response_error_adu) + if response_error_adu[0:2] != adu[0:2]: + # Mismatch in response's slave address or function code + raise ModbusFrameError(response_error_adu) + expected_response_size = \ expected_response_pdu_size_from_request_pdu(adu[1:-2]) + 3 response_remainder = recv_exactly( diff --git a/umodbus/exceptions.py b/umodbus/exceptions.py index 85a9a56..57f74f8 100644 --- a/umodbus/exceptions.py +++ b/umodbus/exceptions.py @@ -3,6 +3,12 @@ class ModbusError(Exception): pass +class ModbusFrameError(ModbusError): + """Reply from an unexpected slave, or an error in the received frame.""" + + pass + + class IllegalFunctionError(ModbusError): """ The function code received in the request is not an allowable action for the server.