summaryrefslogtreecommitdiff
path: root/serial/tools
diff options
context:
space:
mode:
authorcliechti <cliechti@f19166aa-fa4f-0410-85c2-fa1106f25c8a>2011-03-21 23:03:45 +0000
committercliechti <cliechti@f19166aa-fa4f-0410-85c2-fa1106f25c8a>2011-03-21 23:03:45 +0000
commite2c4f9dbb437dda5b33fd0f7ed91991f6948641e (patch)
tree98ab9c44b09c139050f892035342e46306b8307d /serial/tools
parent225cdccf3ad48a8c5a8752673330107fdeebea8e (diff)
downloadpyserial-e2c4f9dbb437dda5b33fd0f7ed91991f6948641e.tar.gz
changed to miniterm: improve error handling on port change, more compact info text
git-svn-id: http://svn.code.sf.net/p/pyserial/code/trunk/pyserial@396 f19166aa-fa4f-0410-85c2-fa1106f25c8a
Diffstat (limited to 'serial/tools')
-rw-r--r--serial/tools/miniterm.py113
1 files changed, 63 insertions, 50 deletions
diff --git a/serial/tools/miniterm.py b/serial/tools/miniterm.py
index ea39f21..314ab59 100644
--- a/serial/tools/miniterm.py
+++ b/serial/tools/miniterm.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
# Very simple serial terminal
-# (C)2002-2009 Chris Liechti <cliechti@gmx.net>
+# (C)2002-2011 Chris Liechti <cliechti@gmx.net>
# Input characters are sent directly (only LF -> CR/LF/CRLF translation is
# done), received characters are displayed as is (or escaped trough pythons
@@ -32,23 +32,23 @@ def get_help_text():
--- %(exit)-8s Exit program
--- %(menu)-8s Menu escape key, followed by:
--- Menu keys:
---- %(itself)-8s Send the menu character itself to remote
---- %(exchar)-8s Send the exit character to remote
---- %(info)-8s Show info
---- %(upload)-8s Upload file (prompt will be shown)
+--- %(itself)-7s Send the menu character itself to remote
+--- %(exchar)-7s Send the exit character itself to remote
+--- %(info)-7s Show info
+--- %(upload)-7s Upload file (prompt will be shown)
--- Toggles:
---- %(rts)s RTS %(echo)s local echo
---- %(dtr)s DTR %(break)s BREAK
---- %(lfm)s line feed %(repr)s Cycle repr mode
+--- %(rts)-7s RTS %(echo)-7s local echo
+--- %(dtr)-7s DTR %(break)-7s BREAK
+--- %(lfm)-7s line feed %(repr)-7s Cycle repr mode
---
--- Port settings (%(menu)s followed by the following):
---- p change port
---- 7 8 set data bits
---- n e o s m change parity (None, Even, Odd, Space, Mark)
---- 1 2 3 set stop bits (1, 2, 1.5)
---- b change baud rate
---- x X disable/enable software flow control
---- r R disable/enable hardware flow control
+--- p change port
+--- 7 8 set data bits
+--- n e o s m change parity (None, Even, Odd, Space, Mark)
+--- 1 2 3 set stop bits (1, 2, 1.5)
+--- b change baud rate
+--- x X disable/enable software flow control
+--- r R disable/enable hardware flow control
""" % {
'version': getattr(serial, 'VERSION', 'unknown version'),
'exit': key_description(EXITCHARCTER),
@@ -181,30 +181,30 @@ class Miniterm(object):
def dump_port_settings(self):
sys.stderr.write("\n--- Settings: %s %s,%s,%s,%s\n" % (
- self.serial.portstr,
- self.serial.baudrate,
- self.serial.bytesize,
- self.serial.parity,
- self.serial.stopbits,
- ))
- sys.stderr.write('--- RTS %s\n' % (self.rts_state and 'active' or 'inactive'))
- sys.stderr.write('--- DTR %s\n' % (self.dtr_state and 'active' or 'inactive'))
- sys.stderr.write('--- BREAK %s\n' % (self.break_state and 'active' or 'inactive'))
- sys.stderr.write('--- software flow control %s\n' % (self.serial.xonxoff and 'active' or 'inactive'))
- sys.stderr.write('--- hardware flow control %s\n' % (self.serial.rtscts and 'active' or 'inactive'))
- sys.stderr.write('--- data escaping: %s\n' % (REPR_MODES[self.repr_mode],))
- sys.stderr.write('--- linefeed: %s\n' % (LF_MODES[self.convert_outgoing],))
+ self.serial.portstr,
+ self.serial.baudrate,
+ self.serial.bytesize,
+ self.serial.parity,
+ self.serial.stopbits))
+ sys.stderr.write('--- RTS: %-8s DTR: %-8s BREAK: %-8s\n' % (
+ (self.rts_state and 'active' or 'inactive'),
+ (self.dtr_state and 'active' or 'inactive'),
+ (self.break_state and 'active' or 'inactive')))
try:
- sys.stderr.write('--- CTS: %s DSR: %s RI: %s CD: %s\n' % (
- (self.serial.getCTS() and 'active' or 'inactive'),
- (self.serial.getDSR() and 'active' or 'inactive'),
- (self.serial.getRI() and 'active' or 'inactive'),
- (self.serial.getCD() and 'active' or 'inactive'),
- ))
+ sys.stderr.write('--- CTS: %-8s DSR: %-8s RI: %-8s CD: %-8s\n' % (
+ (self.serial.getCTS() and 'active' or 'inactive'),
+ (self.serial.getDSR() and 'active' or 'inactive'),
+ (self.serial.getRI() and 'active' or 'inactive'),
+ (self.serial.getCD() and 'active' or 'inactive')))
except serial.SerialException:
# on RFC 2217 ports it can happen to no modem state notification was
# yet received. ignore this error.
pass
+ sys.stderr.write('--- software flow control: %s\n' % (self.serial.xonxoff and 'active' or 'inactive'))
+ sys.stderr.write('--- hardware flow control: %s\n' % (self.serial.rtscts and 'active' or 'inactive'))
+ sys.stderr.write('--- data escaping: %s linefeed: %s\n' % (
+ REPR_MODES[self.repr_mode],
+ LF_MODES[self.convert_outgoing]))
def reader(self):
"""loop and copy serial->console"""
@@ -324,27 +324,37 @@ class Miniterm(object):
sys.stderr.write('\n--- Enter port name: ')
sys.stderr.flush()
console.cleanup()
- port = sys.stdin.readline().strip()
+ try:
+ port = sys.stdin.readline().strip()
+ except KeyboardInterrupt:
+ port = None
console.setup()
- if port:
+ if port and port != self.serial.port:
# reader thread needs to be shut down
self._stop_reader()
# save settings
settings = self.serial.getSettingsDict()
- self.serial.close()
try:
- self.serial = serial.serial_for_url(port, do_not_open=True)
- except AttributeError:
- # happens when the installed pyserial is older than 2.5. use the
- # Serial class directly then.
- self.serial = serial.Serial()
- self.serial.port = port
- # restore settings and open
- self.serial.applySettingsDict(settings)
- self.serial.open()
- self.serial.setRTS(self.rts_state)
- self.serial.setDTR(self.dtr_state)
- self.serial.setBreak(self.break_state)
+ try:
+ new_serial = serial.serial_for_url(port, do_not_open=True)
+ except AttributeError:
+ # happens when the installed pyserial is older than 2.5. use the
+ # Serial class directly then.
+ new_serial = serial.Serial()
+ new_serial.port = port
+ # restore settings and open
+ new_serial.applySettingsDict(settings)
+ new_serial.open()
+ new_serial.setRTS(self.rts_state)
+ new_serial.setDTR(self.dtr_state)
+ new_serial.setBreak(self.break_state)
+ except Exception, e:
+ sys.stderr.write('--- ERROR opening new port: %s ---\n' % (e,))
+ new_serial.close()
+ else:
+ self.serial.close()
+ self.serial = new_serial
+ sys.stderr.write('--- Port changed to: %s ---\n' % (self.serial.port,))
# and restart the reader thread
self._start_reader()
elif c in 'bB': # B -> change baudrate
@@ -614,7 +624,10 @@ def main():
miniterm.rts_state = options.rts_state
miniterm.start()
- miniterm.join(True)
+ try:
+ miniterm.join(True)
+ except KeyboardInterrupt:
+ pass
if not options.quiet:
sys.stderr.write("\n--- exit ---\n")
miniterm.join()