Skip to content

Commit 66dacdf

Browse files
committed
check_frame.
1 parent f5ea97a commit 66dacdf

File tree

2 files changed

+22
-41
lines changed

2 files changed

+22
-41
lines changed

pymodbus/framer/old_framer_rtu.py

Lines changed: 2 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -70,46 +70,6 @@ def decode_data(self, data):
7070
return {"slave": uid, "fcode": fcode}
7171
return {}
7272

73-
74-
def xx_get_frame_start(self, buffer, slaves, broadcast, skip_cur_frame, function_codes):
75-
"""Scan buffer for a relevant frame start."""
76-
start = 1 if skip_cur_frame else 0
77-
if (buf_len := len(buffer)) < 4:
78-
return buffer, False
79-
for i in range(start, buf_len - 3): # <slave id><function code><crc 2 bytes>
80-
if not broadcast and buffer[i] not in slaves:
81-
continue
82-
if (
83-
buffer[i + 1] not in function_codes
84-
and (buffer[i + 1] - 0x80) not in function_codes
85-
):
86-
continue
87-
if i:
88-
buffer = buffer[i:] # remove preceding trash.
89-
return buffer, True
90-
if buf_len > 3:
91-
buffer = buffer[-3:]
92-
return buffer, False
93-
94-
def old_check_frame(self, buffer, decoder):
95-
"""Check if the next frame is available."""
96-
try:
97-
self.dev_id = int(buffer[0])
98-
func_code = int(buffer[1])
99-
pdu_class = decoder.lookupPduClass(func_code)
100-
size = pdu_class.calculateRtuFrameSize(buffer)
101-
self.msg_len = size
102-
103-
if len(buffer) < size:
104-
raise IndexError
105-
frame_size = self.msg_len
106-
data = buffer[: frame_size - 2]
107-
crc = buffer[size - 2 : size]
108-
crc_val = (int(crc[0]) << 8) + int(crc[1])
109-
return FramerRTU.check_CRC(data, crc_val)
110-
except (IndexError, KeyError, struct.error):
111-
return False
112-
11373
def frameProcessIncomingPacket(self, _single, callback, slave, tid=None):
11474
"""Process new packet pattern."""
11575
broadcast = not slave[0]
@@ -122,7 +82,8 @@ def frameProcessIncomingPacket(self, _single, callback, slave, tid=None):
12282
if not ok:
12383
Log.debug("Frame - not ready")
12484
break
125-
if not self.old_check_frame(self._buffer, self.decoder):
85+
self.dev_id, self.msg_len, ok = self.message_handler.old_check_frame(self._buffer, self.msg_len, self.decoder)
86+
if not ok:
12687
Log.debug("Frame check failed, ignoring!!")
12788
x = self._buffer
12889
self.resetFrame()

pymodbus/framer/rtu.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""Modbus RTU frame implementation."""
22
from __future__ import annotations
33

4+
import struct
5+
46
from pymodbus.framer.base import FramerBase
57
from pymodbus.logging import Log
68

@@ -113,6 +115,24 @@ def old_get_frame_start(self, buffer, slaves, broadcast, skip_cur_frame, functio
113115
buffer = buffer[-3:]
114116
return buffer, False
115117

118+
def old_check_frame(self, buffer, msg_len, decoder):
119+
"""Check if the next frame is available."""
120+
try:
121+
dev_id = int(buffer[0])
122+
func_code = int(buffer[1])
123+
pdu_class = decoder.lookupPduClass(func_code)
124+
size = pdu_class.calculateRtuFrameSize(buffer)
125+
126+
if len(buffer) < size:
127+
raise IndexError
128+
frame_size = msg_len
129+
data = buffer[: frame_size - 2]
130+
crc = buffer[size - 2 : size]
131+
crc_val = (int(crc[0]) << 8) + int(crc[1])
132+
return dev_id, size, FramerRTU.check_CRC(data, crc_val)
133+
except (IndexError, KeyError, struct.error):
134+
return dev_id, size, False
135+
116136

117137
def decode(self, data: bytes) -> tuple[int, int, int, bytes]:
118138
"""Decode ADU."""

0 commit comments

Comments
 (0)