diff options
author | cliechti <cliechti@f19166aa-fa4f-0410-85c2-fa1106f25c8a> | 2009-02-16 20:42:32 +0000 |
---|---|---|
committer | cliechti <cliechti@f19166aa-fa4f-0410-85c2-fa1106f25c8a> | 2009-02-16 20:42:32 +0000 |
commit | 4535888b5323e1e00c51d8e53d303032068834e8 (patch) | |
tree | 42927820ee508a36946268c3af38740ac47ccd77 | |
parent | f0fa712fc0003aa2ba2fddea9ba09869a4dfe8c1 (diff) | |
download | pyserial-4535888b5323e1e00c51d8e53d303032068834e8.tar.gz |
1.5 stop bit support
git-svn-id: http://svn.code.sf.net/p/pyserial/code/trunk/pyserial@205 f19166aa-fa4f-0410-85c2-fa1106f25c8a
-rw-r--r-- | CHANGES.txt | 4 | ||||
-rw-r--r-- | serial/serialcli.py | 14 | ||||
-rw-r--r-- | serial/serialjava.py | 12 | ||||
-rw-r--r-- | serial/serialposix.py | 73 | ||||
-rw-r--r-- | serial/serialutil.py | 2 | ||||
-rw-r--r-- | serial/serialwin32.py | 2 |
6 files changed, 59 insertions, 48 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index cb9debc..d57fa7b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -301,10 +301,14 @@ Version 2.5 <date> --------------------------- New Features: +- 1.5 stop bits (STOPBITS_ONE_POINT_FIVE, implemented on all platforms) + Bugfixes: - Improve and fix tcp_serial_redirector example. +- [Bug 2603052] 5-bit mode (needs 1.5 stop bits in some cases) Bugfixes (win32): - [Bug 2469098] parity PARITY_MARK, PARITY_SPACE does't supported in win32 + diff --git a/serial/serialcli.py b/serial/serialcli.py index bc3c893..f205502 100644 --- a/serial/serialcli.py +++ b/serial/serialcli.py @@ -51,17 +51,17 @@ class Serial(SerialBase): """Set communication parameters on opened port.""" if not self._port_handle: raise SerialException("Can only operate on a valid port handle") - + #~ self._port_handle.ReceivedBytesThreshold = 1 - + if self._timeout is None: self._port_handle.ReadTimeout = System.IO.Ports.SerialPort.InfiniteTimeout else: self._port_handle.ReadTimeout = int(self._timeout*1000) - + # if self._timeout != 0 and self._interCharTimeout is not None: # timeouts = (int(self._interCharTimeout * 1000),) + timeouts[1:] - + if self._writeTimeout is None: self._port_handle.WriteTimeout = System.IO.Ports.SerialPort.InfiniteTimeout else: @@ -101,11 +101,13 @@ class Serial(SerialBase): if self._stopbits == STOPBITS_ONE: self._port_handle.StopBits = System.IO.Ports.StopBits.One + elif self._stopbits == STOPBITS_ONE_POINT_FIVE: + self._port_handle.StopBits = System.IO.Ports.StopBits.OnePointFive elif self._stopbits == STOPBITS_TWO: self._port_handle.StopBits = System.IO.Ports.StopBits.Two else: raise ValueError("Unsupported number of stop bits: %r" % self._stopbits) - + if self._rtscts and self._xonxoff: self._port_handle.Handshake = System.IO.Ports.Handshake.RequestToSendXOnXOff elif self._rtscts: @@ -137,7 +139,7 @@ class Serial(SerialBase): raise SerialException(str(e)) # - - - - - - - - - - - - - - - - - - - - - - - - - + def inWaiting(self): """Return the number of characters currently in the input buffer.""" if not self._port_handle: raise portNotOpenError diff --git a/serial/serialjava.py b/serial/serialjava.py index cca46dc..ac7c595 100644 --- a/serial/serialjava.py +++ b/serial/serialjava.py @@ -49,7 +49,7 @@ def device(portnumber): class Serial(SerialBase): """Serial port class, implemented with Java Communications API and thus usable with jython and the appropriate java extension.""" - + def open(self): """Open port with current settings. This may throw a SerialException if the port cannot be opened.""" @@ -73,7 +73,7 @@ class Serial(SerialBase): """Set commuication parameters on opened port.""" if not self.sPort: raise SerialException("Can only operate on a valid port handle") - + self.sPort.enableReceiveTimeout(30) if self._bytesize == FIVEBITS: jdatabits = comm.SerialPort.DATABITS_5 @@ -85,10 +85,10 @@ class Serial(SerialBase): jdatabits = comm.SerialPort.DATABITS_8 else: raise ValueError("unsupported bytesize: %r" % self._bytesize) - + if self._stopbits == STOPBITS_ONE: jstopbits = comm.SerialPort.STOPBITS_1 - elif stopbits == STOPBITS_ONE_HALVE: + elif stopbits == STOPBITS_ONE_POINT_FIVE: self._jstopbits = comm.SerialPort.STOPBITS_1_5 elif self._stopbits == STOPBITS_TWO: jstopbits = comm.SerialPort.STOPBITS_2 @@ -115,10 +115,10 @@ class Serial(SerialBase): if self._xonxoff: jflowin |= comm.SerialPort.FLOWCONTROL_XONXOFF_IN jflowout |= comm.SerialPort.FLOWCONTROL_XONXOFF_OUT - + self.sPort.setSerialPortParams(baudrate, jdatabits, jstopbits, jparity) self.sPort.setFlowControlMode(jflowin | jflowout) - + if self._timeout >= 0: self.sPort.enableReceiveTimeout(self._timeout*1000) else: diff --git a/serial/serialposix.py b/serial/serialposix.py index f66b584..63339b1 100644 --- a/serial/serialposix.py +++ b/serial/serialposix.py @@ -1,9 +1,10 @@ #!/usr/bin/env python +# # Python Serial Port Extension for Win32, Linux, BSD, Jython # module for serial IO for POSIX compatible systems, like Linux # see __init__.py # -# (C) 2001-2008 Chris Liechti <cliechti@gmx.net> +# (C) 2001-2009 Chris Liechti <cliechti@gmx.net> # this is distributed under a free software license, see license.txt # # parts based on code from Grant B. Edwards <grante@visi.com>: @@ -61,7 +62,7 @@ elif plat[:2] == 'hp': #HP-UX (not tested) elif plat[:5] == 'sunos': #Solaris/SunOS (confirmed) def device(port): return '/dev/tty%c' % (ord('a')+port) - + elif plat[:3] == 'aix': #aix def device(port): return '/dev/tty%d' % (port) @@ -81,19 +82,19 @@ counting starts for the first serial port. e.g. 'first serial port: /dev/ttyS0' and with a bit luck you can get this module running... """ % (sys.platform, os.name, VERSION) - #no exception, just continue with a brave attempt to build a device name - #even if the device name is not correct for the platform it has chances - #to work using a string with the real device name as port paramter. + # no exception, just continue with a brave attempt to build a device name + # even if the device name is not correct for the platform it has chances + # to work using a string with the real device name as port paramter. def device(portum): return '/dev/ttyS%d' % portnum #~ raise Exception, "this module does not run on this platform, sorry." -#whats up with "aix", "beos", .... -#they should work, just need to know the device names. +# whats up with "aix", "beos", .... +# they should work, just need to know the device names. -#load some constants for later use. -#try to use values from TERMIOS, use defaults from linux otherwise +# load some constants for later use. +# try to use values from TERMIOS, use defaults from linux otherwise TIOCMGET = hasattr(TERMIOS, 'TIOCMGET') and TERMIOS.TIOCMGET or 0x5415 TIOCMBIS = hasattr(TERMIOS, 'TIOCMBIS') and TERMIOS.TIOCMBIS or 0x5416 TIOCMBIC = hasattr(TERMIOS, 'TIOCMBIC') and TERMIOS.TIOCMBIC or 0x5417 @@ -158,7 +159,7 @@ baudrate_constants = { 3500000: 0010016, 4000000: 0010017 } - + class Serial(SerialBase): """Serial port class POSIX implementation. Serial port configuration is @@ -171,14 +172,14 @@ class Serial(SerialBase): if self._port is None: raise SerialException("Port must be configured before it can be used.") self.fd = None - #open + # open try: self.fd = os.open(self.portstr, os.O_RDWR|os.O_NOCTTY|os.O_NONBLOCK) except Exception, msg: self.fd = None raise SerialException("could not open port %s: %s" % (self._port, msg)) #~ fcntl.fcntl(self.fd, FCNTL.F_SETFL, 0) #set blocking - + try: self._reconfigurePort() except: @@ -187,14 +188,14 @@ class Serial(SerialBase): else: self._isOpen = True #~ self.flushInput() - - + + def _reconfigurePort(self): """Set communication parameters on opened port.""" if self.fd is None: raise SerialException("Can only operate on a valid port handle") custom_baud = None - + vmin = vtime = 0 #timeout is done via select if self._interCharTimeout is not None: vmin = 1 @@ -203,22 +204,22 @@ class Serial(SerialBase): iflag, oflag, cflag, lflag, ispeed, ospeed, cc = termios.tcgetattr(self.fd) except termios.error, msg: #if a port is nonexistent but has a /dev file, it'll fail here raise SerialException("Could not configure port: %s" % msg) - #set up raw mode / no echo / binary + # set up raw mode / no echo / binary cflag |= (TERMIOS.CLOCAL|TERMIOS.CREAD) lflag &= ~(TERMIOS.ICANON|TERMIOS.ECHO|TERMIOS.ECHOE|TERMIOS.ECHOK|TERMIOS.ECHONL| TERMIOS.ISIG|TERMIOS.IEXTEN) #|TERMIOS.ECHOPRT for flag in ('ECHOCTL', 'ECHOKE'): #netbsd workaround for Erk if hasattr(TERMIOS, flag): lflag &= ~getattr(TERMIOS, flag) - + oflag &= ~(TERMIOS.OPOST) iflag &= ~(TERMIOS.INLCR|TERMIOS.IGNCR|TERMIOS.ICRNL|TERMIOS.IGNBRK) if hasattr(TERMIOS, 'IUCLC'): iflag &= ~TERMIOS.IUCLC if hasattr(TERMIOS, 'PARMRK'): iflag &= ~TERMIOS.PARMRK - - #setup baudrate + + # setup baudrate try: ispeed = ospeed = getattr(TERMIOS,'B%s' % (self._baudrate)) except AttributeError: @@ -229,8 +230,8 @@ class Serial(SerialBase): # may need custom baud rate, it isnt in our list. ispeed = ospeed = getattr(TERMIOS, 'B38400') custom_baud = int(self._baudrate) # store for later - - #setup char len + + # setup char len cflag &= ~TERMIOS.CSIZE if self._bytesize == 8: cflag |= TERMIOS.CS8 @@ -242,14 +243,16 @@ class Serial(SerialBase): cflag |= TERMIOS.CS5 else: raise ValueError('Invalid char len: %r' % self._bytesize) - #setup stopbits + # setup stopbits if self._stopbits == STOPBITS_ONE: cflag &= ~(TERMIOS.CSTOPB) + elif self._stopbits == STOPBITS_ONE_POINT_FIVE: + cflag |= (TERMIOS.CSTOPB) # XXX same as TWO.. there is no POSIX support for 1.5 elif self._stopbits == STOPBITS_TWO: cflag |= (TERMIOS.CSTOPB) else: raise ValueError('Invalid stopit specification: %r' % self._stopbits) - #setup parity + # setup parity iflag &= ~(TERMIOS.INPCK|TERMIOS.ISTRIP) if self._parity == PARITY_NONE: cflag &= ~(TERMIOS.PARENB|TERMIOS.PARODD) @@ -260,8 +263,8 @@ class Serial(SerialBase): cflag |= (TERMIOS.PARENB|TERMIOS.PARODD) else: raise ValueError('Invalid parity: %r' % self._parity) - #setup flow control - #xonxoff + # setup flow control + # xonxoff if hasattr(TERMIOS, 'IXANY'): if self._xonxoff: iflag |= (TERMIOS.IXON|TERMIOS.IXOFF) #|TERMIOS.IXANY) @@ -272,7 +275,7 @@ class Serial(SerialBase): iflag |= (TERMIOS.IXON|TERMIOS.IXOFF) else: iflag &= ~(TERMIOS.IXON|TERMIOS.IXOFF) - #rtscts + # rtscts if hasattr(TERMIOS, 'CRTSCTS'): if self._rtscts: cflag |= (TERMIOS.CRTSCTS) @@ -284,19 +287,19 @@ class Serial(SerialBase): else: cflag &= ~(TERMIOS.CNEW_RTSCTS) #XXX should there be a warning if setting up rtscts (and xonxoff etc) fails?? - - #buffer - #vmin "minimal number of characters to be read. = for non blocking" + + # buffer + # vmin "minimal number of characters to be read. = for non blocking" if vmin < 0 or vmin > 255: raise ValueError('Invalid vmin: %r ' % vmin) cc[TERMIOS.VMIN] = vmin - #vtime + # vtime if vtime < 0 or vtime > 255: raise ValueError('Invalid vtime: %r' % vtime) cc[TERMIOS.VTIME] = vtime - #activate settings + # activate settings termios.tcsetattr(self.fd, TERMIOS.TCSANOW, [iflag, oflag, cflag, lflag, ispeed, ospeed, cc]) - + # apply custom baud rate, if any if custom_baud is not None: import array @@ -346,14 +349,14 @@ class Serial(SerialBase): inp = None if size > 0: while len(read) < size: - #print "\tread(): size",size, "have", len(read) #debug + # print "\tread(): size",size, "have", len(read) #debug ready,_,_ = select.select([self.fd],[],[], self._timeout) if not ready: - break #timeout + break # timeout buf = os.read(self.fd, size-len(read)) read = read + buf if (self._timeout >= 0 or self._interCharTimeout > 0) and not buf: - break #early abort on timeout + break # early abort on timeout return read def write(self, data): diff --git a/serial/serialutil.py b/serial/serialutil.py index edba0a0..a1de7c5 100644 --- a/serial/serialutil.py +++ b/serial/serialutil.py @@ -6,7 +6,7 @@ # this is distributed under a free software license, see license.txt PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE = 'N', 'E', 'O', 'M', 'S' -STOPBITS_ONE, STOPBITS_TWO = (1, 2) +STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO = (1, 1.5, 2) FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5, 6, 7, 8) PARITY_NAMES = { diff --git a/serial/serialwin32.py b/serial/serialwin32.py index b6f15f4..fac84f0 100644 --- a/serial/serialwin32.py +++ b/serial/serialwin32.py @@ -140,6 +140,8 @@ class Serial(SerialBase): if self._stopbits == STOPBITS_ONE: comDCB.StopBits = win32file.ONESTOPBIT + elif self._stopbits == STOPBITS_ONE_POINT_FIVE: + comDCB.StopBits = win32file.ONE5STOPBITS elif self._stopbits == STOPBITS_TWO: comDCB.StopBits = win32file.TWOSTOPBITS else: |