Skip to content

Commit 635d8ab

Browse files
stv0gdhoomakethu
authored andcommitted
rtu_framer: fix processing of incomplete frames (#466)
* rtu_framer: fix processing of incomplete frames * rtu_framer: fix test case
1 parent 632d300 commit 635d8ab

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

pymodbus/framer/rtu_framer.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,13 @@ def isFrameReady(self):
137137
138138
:returns: True if ready, False otherwise
139139
"""
140-
return len(self._buffer) > self._hsize
140+
if len(self._buffer) > self._hsize:
141+
if not self._header:
142+
self.populateHeader()
143+
144+
return self._header and len(self._buffer) >= self._header['len']
145+
else:
146+
return False
141147

142148
def populateHeader(self, data=None):
143149
"""

test/test_framers.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,13 @@ def test_reset_framer(rtu_framer, data):
8888
assert rtu_framer._buffer == b''
8989

9090

91-
@pytest.mark.parametrize("data", [(b'', False), (b'abcd', True)])
91+
@pytest.mark.parametrize("data", [
92+
(b'', False),
93+
(b'\x11\x03\x06', False),
94+
(b'\x11\x03\x06\xAE\x41\x56\x52\x43\x40\x49', False),
95+
(b'\x11\x03\x06\xAE\x41\x56\x52\x43\x40\x49\xAD', True),
96+
(b'\x11\x03\x06\xAE\x41\x56\x52\x43\x40\x49\xAD\xAB\xCD', True)
97+
])
9298
def test_is_frame_ready(rtu_framer, data):
9399
data, expected = data
94100
rtu_framer._buffer = data
@@ -185,4 +191,4 @@ def test_decode_ascii_data(ascii_framer, data):
185191
assert data.get("unit") == 1
186192
assert data.get("fcode") == 1
187193
else:
188-
assert not data
194+
assert not data

0 commit comments

Comments
 (0)