Skip to content

Commit 8af46d8

Browse files
banana-sunsunlinjieSunjaniversen
authored
serial sync recv interval (#1389)
* fix: Serial changes the receiving interval by baudrate.(#1183) Co-authored-by: sunlinjie <[email protected]> Co-authored-by: Sun <[email protected]> Co-authored-by: jan iversen <[email protected]>
1 parent e19b103 commit 8af46d8

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

pymodbus/client/serial.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,11 +218,23 @@ def __init__(
218218
self.socket = None
219219

220220
self.last_frame_end = None
221+
222+
self._t0 = float((1 + 8 + 2)) / self.params.baudrate
223+
224+
"""
225+
The minimum delay is 0.01s and the maximum can be set to 0.05s.
226+
Setting too large a setting affects efficiency.
227+
"""
228+
self._recv_interval = (
229+
(round((100 * self._t0), 2) + 0.01)
230+
if (round((100 * self._t0), 2) + 0.01) < 0.05
231+
else 0.05
232+
)
233+
221234
if isinstance(self.framer, ModbusRtuFramer):
222235
if self.params.baudrate > 19200:
223236
self.silent_interval = 1.75 / 1000 # ms
224237
else:
225-
self._t0 = float((1 + 8 + 2)) / self.params.baudrate
226238
self.inter_char_timeout = 1.5 * self._t0
227239
self.silent_interval = 3.5 * self._t0
228240
self.silent_interval = round(self.silent_interval, 6)
@@ -318,7 +330,7 @@ def _wait_for_data(self):
318330
if available and available != size:
319331
more_data = True
320332
size = available
321-
time.sleep(0.01)
333+
time.sleep(self._recv_interval)
322334
return size
323335

324336
def recv(self, size):
@@ -331,7 +343,7 @@ def recv(self, size):
331343
if size is None:
332344
size = self._wait_for_data()
333345
if size > self._in_waiting():
334-
size = self._wait_for_data()
346+
self._wait_for_data()
335347
result = self.socket.read(size)
336348
return result
337349

test/test_client_sync.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ def test_basic_sync_serial_client(self, mock_serial):
388388
self.assertEqual(0, client.send(None))
389389
client.state = 0
390390
self.assertEqual(1, client.send(b"\x00"))
391-
self.assertEqual(b"", client.recv(1))
391+
self.assertEqual(b"\x00", client.recv(1))
392392

393393
# connect/disconnect
394394
self.assertTrue(client.connect())

0 commit comments

Comments
 (0)