Skip to content

Commit c548974

Browse files
authored
Solve multiple incomming frames. (#1107)
1 parent 812f2bd commit c548974

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

pymodbus/framer/rtu_framer.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -232,21 +232,25 @@ def processIncomingPacket(
232232
unit = [unit]
233233
self.addToFrame(data)
234234
single = kwargs.get("single", False)
235-
if self.isFrameReady():
236-
if self.checkFrame():
237-
if self._validate_unit_id(unit, single):
238-
self._process(callback)
235+
while True:
236+
if self.isFrameReady():
237+
if self.checkFrame():
238+
if self._validate_unit_id(unit, single):
239+
self._process(callback)
240+
else:
241+
header_txt = self._header["uid"]
242+
txt = f"Not a valid unit id - {header_txt}, ignoring!!"
243+
_logger.debug(txt)
244+
self.resetFrame()
245+
break
239246
else:
240-
header_txt = self._header["uid"]
241-
txt = f"Not a valid unit id - {header_txt}, ignoring!!"
242-
_logger.debug(txt)
247+
_logger.debug("Frame check failed, ignoring!!")
243248
self.resetFrame()
249+
break
244250
else:
245-
_logger.debug("Frame check failed, ignoring!!")
246-
self.resetFrame()
247-
else:
248-
txt = f"Frame - [{data}] not ready"
249-
_logger.debug(txt)
251+
txt = f"Frame - [{data}] not ready"
252+
_logger.debug(txt)
253+
break
250254

251255
def buildPacket(self, message):
252256
"""Create a ready to send modbus packet.

test/test_framers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,8 @@ def test_rtu_incoming_packet(rtu_framer, data): # pylint: disable=redefined-out
266266
"""Test rtu process incoming packet."""
267267
buffer, units, reset_called, process_called = data
268268

269-
with patch.object(rtu_framer, "_process") as mock_process, patch.object(
270-
rtu_framer, "resetFrame"
269+
with patch.object(rtu_framer, "_process", wraps=rtu_framer._process) as mock_process, patch.object( # pylint: disable=protected-access
270+
rtu_framer, "resetFrame", wraps=rtu_framer.resetFrame
271271
) as mock_reset:
272272
rtu_framer.processIncomingPacket(buffer, Mock(), units)
273273
assert mock_process.call_count == (1 if process_called else 0) # nosec

0 commit comments

Comments
 (0)