Skip to content

Commit 661c816

Browse files
ccatterinadhoomakethu
authored andcommitted
Recall socket recv until get a complete response. (#143)
Socket recv waits until it gets some data from the host but not necessarily the entire response that can be fragmented in many packets. In this case it receives an incomplete frame that is rejected by the frame handler. This commit solves this issue by recalling socket recv until get a complete modbus response.
1 parent 6f5f482 commit 661c816

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

pymodbus/transaction.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def _set_adu_size(self):
6868

6969
def _calculate_response_length(self, expected_pdu_size):
7070
if self.base_adu_size == -1:
71-
return 1024
71+
return None
7272
else:
7373
return self.base_adu_size + expected_pdu_size
7474

@@ -79,21 +79,26 @@ def execute(self, request):
7979
retries = self.retries
8080
request.transaction_id = self.getNextTID()
8181
_logger.debug("Running transaction %d" % request.transaction_id)
82+
83+
expected_response_length = None
8284
if hasattr(request, "get_response_pdu_size"):
8385
response_pdu_size = request.get_response_pdu_size()
84-
expected_response_length = self._calculate_response_length(response_pdu_size)
85-
else:
86-
expected_response_length = 1024
86+
if response_pdu_size:
87+
expected_response_length = self._calculate_response_length(response_pdu_size)
8788

8889
while retries > 0:
8990
try:
9091
self.client.connect()
9192
self.client._send(self.client.framer.buildPacket(request))
92-
result = self.client._recv(expected_response_length)
93+
94+
result = self.client._recv(expected_response_length or 1024)
95+
while result and expected_response_length and len(result) < expected_response_length:
96+
result += self.client._recv(expected_response_length - len(result))
9397

9498
if not result and self.retry_on_empty:
9599
retries -= 1
96100
continue
101+
97102
if _logger.isEnabledFor(logging.DEBUG):
98103
_logger.debug("recv: " + " ".join([hex(byte2int(x)) for x in result]))
99104
self.client.framer.processIncomingPacket(result, self.addTransaction)

0 commit comments

Comments
 (0)