blob: d373a5566d23cf7ba44fadef0d63411259e1cc42 [file] [log] [blame]
#!/usr/bin/env python
# portable serial port access with python
# this is a wrapper module for different platform implementations of the
# port enumeration feature
#
# (C) 2011-2013 Chris Liechti <cliechti@gmx.net>
# this is distributed under a free software license, see license.txt
"""\
This module will provide a function called comports that returns an
iterable (generator or list) that will enumerate available com ports. Note that
on some systems non-existent ports may be listed.
Additionally a grep function is supplied that can be used to search for ports
based on their descriptions or hardware ID.
"""
import sys, os, re
# chose an implementation, depending on os
#~ if sys.platform == 'cli':
#~ else:
import os
# chose an implementation, depending on os
if os.name == 'nt': #sys.platform == 'win32':
from serial.tools.list_ports_windows import *
elif os.name == 'posix':
from serial.tools.list_ports_posix import *
#~ elif os.name == 'java':
else:
raise ImportError("Sorry: no implementation for your platform ('%s') available" % (os.name,))
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
def grep(regexp):
"""\
Search for ports using a regular expression. Port name, description and
hardware ID are searched. The function returns an iterable that returns the
same tuples as comport() would do.
"""
r = re.compile(regexp, re.I)
for port, desc, hwid in comports():
if r.search(port) or r.search(desc) or r.search(hwid):
yield port, desc, hwid
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
def main():
import optparse
parser = optparse.OptionParser(
usage = "%prog [options] [<regexp>]",
description = "Miniterm - A simple terminal program for the serial port."
)
parser.add_option("--debug",
help="print debug messages and tracebacks (development mode)",
dest="debug",
default=False,
action='store_true')
parser.add_option("-v", "--verbose",
help="show more messages (can be given multiple times)",
dest="verbose",
default=1,
action='count')
parser.add_option("-q", "--quiet",
help="suppress all messages",
dest="verbose",
action='store_const',
const=0)
(options, args) = parser.parse_args()
hits = 0
# get iteraror w/ or w/o filter
if args:
if len(args) > 1:
parser.error('more than one regexp not supported')
print "Filtered list with regexp: %r" % (args[0],)
iterator = sorted(grep(args[0]))
else:
iterator = sorted(comports())
# list them
for port, desc, hwid in iterator:
print("%-20s" % (port,))
if options.verbose > 1:
print(" desc: %s" % (desc,))
print(" hwid: %s" % (hwid,))
hits += 1
if options.verbose:
if hits:
print("%d ports found" % (hits,))
else:
print("no ports found")
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# test
if __name__ == '__main__':
main()