Skip to content

Commit cc15462

Browse files
jabdoa2rob-smallshire
authored andcommitted
Add serial support by polling on windows (#8)
Add serial support by polling on Windows (workaround in lieu of IOCP support)
1 parent fce1d4d commit cc15462

File tree

1 file changed

+67
-25
lines changed

1 file changed

+67
-25
lines changed

serial_asyncio/__init__.py

Lines changed: 67 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@
1515
implementation. It should be possible to get that working though.
1616
"""
1717
import asyncio
18+
import os
19+
1820
import serial
19-
import termios
2021

22+
try:
23+
import termios
24+
except ImportError:
25+
termios = None
2126

2227
__version__ = '0.1'
2328

@@ -50,6 +55,7 @@ def __init__(self, loop, protocol, serial_instance):
5055
self._set_write_buffer_limits()
5156
self._has_reader = False
5257
self._has_writer = False
58+
self._poll_wait_time = 0.0005
5359

5460
# XXX how to support url handlers too
5561

@@ -259,25 +265,58 @@ def _write_ready(self):
259265
self._maybe_resume_protocol()
260266
assert self._has_writer
261267

262-
def _ensure_reader(self):
263-
if (not self._has_reader) and (not self._closing):
264-
self._loop.add_reader(self._serial.fd, self._read_ready)
265-
self._has_reader = True
266-
267-
def _remove_reader(self):
268-
if self._has_reader:
269-
self._loop.remove_reader(self._serial.fd)
270-
self._has_reader = False
271-
272-
def _ensure_writer(self):
273-
if (not self._has_writer) and (not self._closing):
274-
self._loop.add_writer(self._serial.fd, self._write_ready)
275-
self._has_writer = True
276-
277-
def _remove_writer(self):
278-
if self._has_writer:
279-
self._loop.remove_writer(self._serial.fd)
280-
self._has_writer = False
268+
if os.name == "nt":
269+
def _poll_read(self):
270+
if self._has_reader:
271+
if self.serial.in_waiting:
272+
self._loop.call_soon(self._read_ready)
273+
self._loop.call_later(self._poll_wait_time, self._poll_read)
274+
275+
def _ensure_reader(self):
276+
if (not self._has_reader) and (not self._closing):
277+
self._loop.call_later(self._poll_wait_time, self._poll_read)
278+
self._has_reader = True
279+
280+
def _remove_reader(self):
281+
if self._has_reader:
282+
self._has_reader = False
283+
284+
def _poll_write(self):
285+
if self._has_writer:
286+
if self.serial.out_waiting:
287+
self._loop.call_soon(self._write_ready)
288+
self._loop.call_later(self._poll_wait_time, self._poll_write)
289+
290+
def _ensure_writer(self):
291+
if (not self._has_writer) and (not self._closing):
292+
self._loop.call_later(self._poll_wait_time, self._poll_write)
293+
self._has_writer = True
294+
295+
def _remove_writer(self):
296+
if self._has_writer:
297+
self._loop.remove_writer(self._serial.fd)
298+
self._has_writer = False
299+
300+
else:
301+
def _ensure_reader(self):
302+
if (not self._has_reader) and (not self._closing):
303+
self._loop.add_reader(self._serial.fd, self._read_ready)
304+
self._has_reader = True
305+
306+
def _remove_reader(self):
307+
if self._has_reader:
308+
self._loop.remove_reader(self._serial.fd)
309+
self._has_reader = False
310+
311+
def _ensure_writer(self):
312+
if (not self._has_writer) and (not self._closing):
313+
self._loop.add_writer(self._serial.fd, self._write_ready)
314+
self._has_writer = True
315+
316+
def _remove_writer(self):
317+
if self._has_writer:
318+
self._loop.remove_writer(self._serial.fd)
319+
self._has_writer = False
281320

282321
def _set_write_buffer_limits(self, high=None, low=None):
283322
"""Ensure consistent write-buffer limits."""
@@ -346,12 +385,15 @@ def _call_connection_lost(self, exc):
346385
assert self._closing
347386
assert not self._has_writer
348387
assert not self._has_reader
349-
try:
388+
if os.name == "nt":
350389
self._serial.flush()
351-
except termios.error:
352-
# ignore termios errors which may happen if the serial device was
353-
# hot-unplugged.
354-
pass
390+
else:
391+
try:
392+
self._serial.flush()
393+
except termios.error:
394+
# ignore termios errors which may happen if the serial device was
395+
# hot-unplugged.
396+
pass
355397
try:
356398
self._protocol.connection_lost(exc)
357399
finally:

0 commit comments

Comments
 (0)