Improve serial read speeds by using a larger nonblocking read on POSIX
This commit is contained in:
parent
6c5b85b618
commit
b765576283
51
terminal.py
51
terminal.py
|
@ -44,8 +44,11 @@ if os.name == 'nt':
|
|||
return z
|
||||
if (time.time() - start) > 0.1:
|
||||
return None
|
||||
class MySerial(serial.Serial):
|
||||
def nonblocking_read(self, size=1):
|
||||
return self.read(size)
|
||||
elif os.name == 'posix':
|
||||
import termios, select
|
||||
import termios, select, errno
|
||||
class Console:
|
||||
def __init__(self, bufsize = 65536):
|
||||
self.bufsize = bufsize
|
||||
|
@ -75,6 +78,21 @@ elif os.name == 'posix':
|
|||
return ''
|
||||
else:
|
||||
return None
|
||||
class MySerial(serial.Serial):
|
||||
def nonblocking_read(self, size=1, timeout = 0.1):
|
||||
[r, w, x] = select.select([self.fd], [], [self.fd], timeout)
|
||||
if r:
|
||||
try:
|
||||
return os.read(self.fd, size)
|
||||
except OSError as e:
|
||||
if e.errno == errno.EAGAIN:
|
||||
return ''
|
||||
raise
|
||||
elif x:
|
||||
raise SerialException("exception (device disconnected?)")
|
||||
else:
|
||||
return ''
|
||||
|
||||
else:
|
||||
raise ("Sorry, no terminal implementation for your platform (%s) "
|
||||
"available." % sys.platform)
|
||||
|
@ -169,32 +187,35 @@ class Jimterm:
|
|||
first = True
|
||||
try:
|
||||
while self.alive:
|
||||
data = serial.read(1)
|
||||
if not data:
|
||||
# For a POSIX system, do a not-retarded read.
|
||||
data = serial.nonblocking_read(self.bufsize)
|
||||
if not data or data == "":
|
||||
continue
|
||||
|
||||
# don't print a NULL if it's the first character we
|
||||
# read. This hides startup/port-opening glitches with
|
||||
# some serial devices.
|
||||
if self.suppress_read_firstnull and first and data == '\0':
|
||||
if self.suppress_read_firstnull and first and data[0] == '\0':
|
||||
first = False
|
||||
continue
|
||||
data = data[1:]
|
||||
first = False
|
||||
|
||||
if color != self.last_color:
|
||||
self.last_color = color
|
||||
sys.stdout.write(color)
|
||||
|
||||
if (self.raw or
|
||||
(ord(data) >= 32 and ord(data) < 128) or
|
||||
data == '\r' or data == '\n' or data == '\t'):
|
||||
if self.add_cr and data == '\n':
|
||||
sys.stdout.write('\r' + data)
|
||||
else:
|
||||
sys.stdout.write(data)
|
||||
else:
|
||||
sys.stdout.write('\\x'+("0"+hex(ord(data))[2:])[-2:])
|
||||
if self.add_cr:
|
||||
data = data.replace('\n', '\r\n')
|
||||
|
||||
if not self.raw:
|
||||
# Escape unprintable chars
|
||||
data = data.encode('unicode_escape')
|
||||
# But these are OK, change them back
|
||||
data = data.replace("\\n", "\n")
|
||||
data = data.replace("\\r", "\r")
|
||||
data = data.replace("\\t", "\t")
|
||||
|
||||
sys.stdout.write(data)
|
||||
sys.stdout.flush()
|
||||
except Exception as e:
|
||||
sys.stdout.write(color)
|
||||
|
@ -346,7 +367,7 @@ if __name__ == "__main__":
|
|||
sys.stderr.write("error: %s specified more than once\n" % node)
|
||||
raise SystemExit(1)
|
||||
try:
|
||||
dev = serial.Serial(node, baud, rtscts = args.flow)
|
||||
dev = MySerial(node, baud, rtscts = args.flow)
|
||||
except serial.serialutil.SerialException:
|
||||
sys.stderr.write("error opening %s\n" % node)
|
||||
raise SystemExit(1)
|
||||
|
|
Loading…
Reference in New Issue
Block a user