Skip to content

Commit 43c3dfd

Browse files
committed
fix ModbusClient multiple packets recv
1 parent 2e22ced commit 43c3dfd

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

pyModbusTCP/client.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,23 @@ def _recv(self, max_size):
805805
return None
806806
return r_buffer
807807

808+
def _recv_all(self, size):
809+
"""Receive data over current socket, loop until all bytes is receive (avoid TCP frag)
810+
811+
:param size: number of bytes to receive
812+
:type size: int
813+
:returns: receive data or None if error
814+
:rtype: str (Python2) or class bytes (Python3) or None
815+
"""
816+
r_buffer = bytearray()
817+
while len(r_buffer) < size:
818+
print('recv_all loop here')
819+
r_packet = self._recv(size - len(r_buffer))
820+
if not r_packet:
821+
return None
822+
r_buffer += r_packet
823+
return r_buffer
824+
808825
def _send_mbus(self, frame):
809826
"""Send modbus frame
810827
@@ -835,7 +852,7 @@ def _recv_mbus(self):
835852
# modbus TCP receive
836853
if self.__mode == const.MODBUS_TCP:
837854
# 7 bytes header (mbap)
838-
rx_buffer = self._recv(7)
855+
rx_buffer = self._recv_all(7)
839856
# check recv
840857
if not (rx_buffer and len(rx_buffer) == 7):
841858
self.__last_error = const.MB_RECV_ERR
@@ -854,12 +871,12 @@ def _recv_mbus(self):
854871
self.__last_error = const.MB_RECV_ERR
855872
self.__debug_msg('MBAP format error')
856873
if self.__debug:
857-
rx_frame += self._recv(rx_hd_length - 1)
874+
rx_frame += self._recv_all(rx_hd_length - 1)
858875
self._pretty_dump('Rx', rx_frame)
859876
self.close()
860877
return None
861878
# end of frame
862-
rx_buffer = self._recv(rx_hd_length - 1)
879+
rx_buffer = self._recv_all(rx_hd_length - 1)
863880
if not (rx_buffer and
864881
(len(rx_buffer) == rx_hd_length - 1) and
865882
(len(rx_buffer) >= 2)):

0 commit comments

Comments
 (0)