diff --git a/pymodbus/client/serial.py b/pymodbus/client/serial.py index 383e5d376..10df85fbc 100644 --- a/pymodbus/client/serial.py +++ b/pymodbus/client/serial.py @@ -218,11 +218,23 @@ def __init__( self.socket = None self.last_frame_end = None + + self._t0 = float((1 + 8 + 2)) / self.params.baudrate + + """ + The minimum delay is 0.01s and the maximum can be set to 0.05s. + Setting too large a setting affects efficiency. + """ + self._recv_interval = ( + (round((100 * self._t0), 2) + 0.01) + if (round((100 * self._t0), 2) + 0.01) < 0.05 + else 0.05 + ) + if isinstance(self.framer, ModbusRtuFramer): if self.params.baudrate > 19200: self.silent_interval = 1.75 / 1000 # ms else: - self._t0 = float((1 + 8 + 2)) / self.params.baudrate self.inter_char_timeout = 1.5 * self._t0 self.silent_interval = 3.5 * self._t0 self.silent_interval = round(self.silent_interval, 6) @@ -318,7 +330,7 @@ def _wait_for_data(self): if available and available != size: more_data = True size = available - time.sleep(0.01) + time.sleep(self._recv_interval) return size def recv(self, size): @@ -331,7 +343,7 @@ def recv(self, size): if size is None: size = self._wait_for_data() if size > self._in_waiting(): - size = self._wait_for_data() + self._wait_for_data() result = self.socket.read(size) return result diff --git a/test/test_client_sync.py b/test/test_client_sync.py index 476075f36..3c6845212 100755 --- a/test/test_client_sync.py +++ b/test/test_client_sync.py @@ -388,7 +388,7 @@ def test_basic_sync_serial_client(self, mock_serial): self.assertEqual(0, client.send(None)) client.state = 0 self.assertEqual(1, client.send(b"\x00")) - self.assertEqual(b"", client.recv(1)) + self.assertEqual(b"\x00", client.recv(1)) # connect/disconnect self.assertTrue(client.connect())