Skip to content

Commit f9c0ec5

Browse files
committed
Allow socket frames to be split in several packets.
1 parent 7feef8f commit f9c0ec5

File tree

2 files changed

+28
-33
lines changed

2 files changed

+28
-33
lines changed

pymodbus/framer/socket_framer.py

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -52,20 +52,21 @@ def checkFrame(self):
5252
5353
Return true if we were successful.
5454
"""
55-
if self.isFrameReady():
56-
(
57-
self._header["tid"],
58-
self._header["pid"],
59-
self._header["len"],
60-
self._header["uid"],
61-
) = struct.unpack(">HHHB", self._buffer[0 : self._hsize])
62-
63-
# someone sent us an error? ignore it
64-
if self._header["len"] < 2:
65-
self.advanceFrame()
66-
# we have at least a complete message, continue
67-
elif len(self._buffer) - self._hsize + 1 >= self._header["len"]:
68-
return True
55+
if not self.isFrameReady():
56+
return False
57+
(
58+
self._header["tid"],
59+
self._header["pid"],
60+
self._header["len"],
61+
self._header["uid"],
62+
) = struct.unpack(">HHHB", self._buffer[0 : self._hsize])
63+
64+
# someone sent us an error? ignore it
65+
if self._header["len"] < 2:
66+
self.advanceFrame()
67+
# we have at least a complete message, continue
68+
elif len(self._buffer) - self._hsize + 1 >= self._header["len"]:
69+
return True
6970
# we don't have enough of a message yet, wait
7071
return False
7172

@@ -128,23 +129,15 @@ def frameProcessIncomingPacket(self, single, callback, slave, tid=None, **kwargs
128129
The processed and decoded messages are pushed to the callback
129130
function to process and send.
130131
"""
131-
while True:
132-
if not self.isFrameReady():
133-
if len(self._buffer):
134-
# Possible error ???
135-
if self._header["len"] < 2:
136-
self._process(callback, tid, error=True)
137-
break
138-
if not self.checkFrame():
139-
Log.debug("Frame check failed, ignoring!!")
140-
self.resetFrame()
141-
continue
142-
if not self._validate_slave_id(slave, single):
143-
header_txt = self._header["uid"]
144-
Log.debug("Not a valid slave id - {}, ignoring!!", header_txt)
145-
self.resetFrame()
146-
continue
147-
self._process(callback, tid)
132+
if not self.checkFrame():
133+
Log.debug("Frame check failed, ignoring!!")
134+
return
135+
if not self._validate_slave_id(slave, single):
136+
header_txt = self._header["uid"]
137+
Log.debug("Not a valid slave id - {}, ignoring!!", header_txt)
138+
self.resetFrame()
139+
return
140+
self._process(callback, tid)
148141

149142
def _process(self, callback, tid, error=False):
150143
"""Process incoming packets irrespective error condition."""

test/test_framers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -382,11 +382,13 @@ def _handle_response(reply):
382382
part2 = message[i:]
383383
response_ok = False
384384
framer = ModbusSocketFramer(ClientDecoder())
385+
if i == 8:
386+
print("jan")
385387
if i:
386388
try:
387389
framer.processIncomingPacket(part1, _handle_response, slave=0)
388390
except Exception:
389391
pytest.fail("Exception should not happen")
390-
assert not response_ok
392+
assert not response_ok, "Response should not be accepted"
391393
framer.processIncomingPacket(part2, _handle_response, slave=0)
392-
assert response_ok
394+
assert response_ok, "Response is valid, but not accepted"

0 commit comments

Comments
 (0)