summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorcliechti <cliechti@f19166aa-fa4f-0410-85c2-fa1106f25c8a>2009-08-10 01:30:53 +0000
committercliechti <cliechti@f19166aa-fa4f-0410-85c2-fa1106f25c8a>2009-08-10 01:30:53 +0000
commitc424b2b782aedac9e35bf2624a4102ecc15c6459 (patch)
treec72e24fce9ea2316cf4fc12504483ed0db7d7ce1 /examples
parentc0b578022c90931bb72bfdb0b56a783d7025ce42 (diff)
downloadpyserial-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.py17
-rw-r--r--examples/rfc2217_server.py36
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')
-