diff options
author | cliechti <cliechti@f19166aa-fa4f-0410-85c2-fa1106f25c8a> | 2009-08-10 01:30:53 +0000 |
---|---|---|
committer | cliechti <cliechti@f19166aa-fa4f-0410-85c2-fa1106f25c8a> | 2009-08-10 01:30:53 +0000 |
commit | c424b2b782aedac9e35bf2624a4102ecc15c6459 (patch) | |
tree | c72e24fce9ea2316cf4fc12504483ed0db7d7ce1 /examples | |
parent | c0b578022c90931bb72bfdb0b56a783d7025ce42 (diff) | |
download | pyserial-c424b2b782aedac9e35bf2624a4102ecc15c6459.tar.gz |
- sotre/restore port settings on connect/disconnect
- better cleanup on exit
- print host name that connects
git-svn-id: http://svn.code.sf.net/p/pyserial/code/trunk/pyserial@327 f19166aa-fa4f-0410-85c2-fa1106f25c8a
Diffstat (limited to 'examples')
-rw-r--r-- | examples/port_publisher.py | 17 | ||||
-rw-r--r-- | examples/rfc2217_server.py | 36 |
2 files changed, 43 insertions, 10 deletions
diff --git a/examples/port_publisher.py b/examples/port_publisher.py index 23839dc..efb269c 100644 --- a/examples/port_publisher.py +++ b/examples/port_publisher.py @@ -111,6 +111,8 @@ class Forwarder(ZeroconfService): except Exception, msg:
self.handle_serial_error(msg)
+ self.serial_settings_backup = self.serial.getSettingsDict()
+
# start the socket server
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(
@@ -250,6 +252,8 @@ class Forwarder(ZeroconfService): def handle_connect(self):
"""Server socket gets a connection"""
+ print "XXX", self.serial.getSettingsDict()
+
# accept a connection in any case, close connection
# below if already busy
connection, addr = self.server_socket.accept()
@@ -258,7 +262,13 @@ class Forwarder(ZeroconfService): self.socket.setblocking(0)
self.socket.setsockopt( socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
if not options.quiet:
- print '%s: Connected by %s:%s' % (self.device, addr[0], addr[1])
+ try:
+ host = socket.gethostbyaddr(addr[0])[0]
+ except (socket.herror, socket.gaierror):
+ host = '<unknown>'
+ print '%s: Connected by %s (%s:%s)' % (self.device, host, addr[0], addr[1])
+ self.serial.setRTS(True)
+ self.serial.setDTR(True)
self.rfc2217 = serial.rfc2217.PortManager(self.serial, self, debug_output=False)
else:
# reject connection if there is already one
@@ -272,6 +282,11 @@ class Forwarder(ZeroconfService): def handle_disconnect(self):
"""Socket gets disconnected"""
+ # signal disconnected terminal with control lines
+ self.serial.setRTS(False)
+ self.serial.setDTR(False)
+ # restore original port configuration in case it was changed
+ self.serial.applySettingsDict(self.serial_settings_backup)
# stop RFC 2217 state machine
self.rfc2217 = None
# clear send buffer
diff --git a/examples/rfc2217_server.py b/examples/rfc2217_server.py index 151d3c3..6730aaf 100644 --- a/examples/rfc2217_server.py +++ b/examples/rfc2217_server.py @@ -81,14 +81,14 @@ class Redirector: sys.stderr.write('ERROR: %s\n' % msg) # probably got disconnected break - self.alive = False - self.thread_read.join() + self.stop() def stop(self): """Stop copying""" if self.alive: self.alive = False self.thread_read.join() + self.thread_poll.join() if __name__ == '__main__': @@ -121,7 +121,7 @@ it waits for the next connect. # connect to serial port ser = serial.Serial() ser.port = args[0] - ser.timeout = 1 # required so that the reader thread can exit + ser.timeout = 3 # required so that the reader thread can exit sys.stderr.write("--- RFC 2217 TCP/IP to Serial redirector --- type Ctrl-C / BREAK to quit\n") @@ -132,6 +132,10 @@ it waits for the next connect. sys.exit(1) sys.stderr.write("--- Serving serial port: %s\n" % (ser.portstr,)) + settings = ser.getSettingsDict() + # reset contol line as no _remote_ "terminal" has been connected yet + ser.setDTR(False) + ser.setRTS(False) srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) @@ -141,19 +145,33 @@ it waits for the next connect. while True: try: connection, addr = srv.accept() - sys.stderr.write('Connected by %s\n' % (addr,)) - # enter console->serial loop + try: + host = socket.gethostbyaddr(addr[0])[0] + except (socket.herror, socket.gaierror): + host = '<unknown>' + sys.stderr.write('Connected by %s (%s) \n' % (host, addr,)) + connection.setsockopt( socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + ser.setRTS(True) + ser.setDTR(True) + # enter network <-> serial loop r = Redirector( ser, connection, ) - r.shortcut() - sys.stderr.write('Disconnected\n') - connection.close() + try: + r.shortcut() + finally: + sys.stderr.write('Disconnected\n') + r.stop() + connection.close() + ser.setDTR(False) + ser.setRTS(False) + # Restore port settings (may have been changed by RFC 2217 capable + # client) + ser.applySettingsDict(settings) except KeyboardInterrupt: break except socket.error, msg: sys.stderr.write('ERROR: %s\n' % msg) sys.stderr.write('\n--- exit ---\n') - |