diff options
author | (no author) <(no author)@f19166aa-fa4f-0410-85c2-fa1106f25c8a> | 2005-01-27 00:53:04 +0000 |
---|---|---|
committer | (no author) <(no author)@f19166aa-fa4f-0410-85c2-fa1106f25c8a> | 2005-01-27 00:53:04 +0000 |
commit | e7f32979eb3a302e1b64243e590aee2f12fef979 (patch) | |
tree | e39d76703aef0e5f6ee244ae421f3f7fe6857940 | |
parent | 8430d09f6d3b602358d8a65794ad895b02397453 (diff) | |
download | pyserial-e7f32979eb3a302e1b64243e590aee2f12fef979.tar.gz |
This commit was manufactured by cvs2svn to create tag 'release_0_2'.release_0_2
git-svn-id: http://svn.code.sf.net/p/pyserial/code/tags/release_0_2@134 f19166aa-fa4f-0410-85c2-fa1106f25c8a
34 files changed, 0 insertions, 3999 deletions
diff --git a/CVSROOT/checkoutlist b/CVSROOT/checkoutlist deleted file mode 100644 index b04b350..0000000 --- a/CVSROOT/checkoutlist +++ /dev/null @@ -1,13 +0,0 @@ -# The "checkoutlist" file is used to support additional version controlled -# administrative files in $CVSROOT/CVSROOT, such as template files. -# -# The first entry on a line is a filename which will be checked out from -# the corresponding RCS file in the $CVSROOT/CVSROOT directory. -# The remainder of the line is an error message to use if the file cannot -# be checked out. -# -# File format: -# -# [<whitespace>]<filename><whitespace><error message><end-of-line> -# -# comment lines begin with '#' diff --git a/CVSROOT/commitinfo b/CVSROOT/commitinfo deleted file mode 100644 index b19e7b7..0000000 --- a/CVSROOT/commitinfo +++ /dev/null @@ -1,15 +0,0 @@ -# The "commitinfo" file is used to control pre-commit checks. -# The filter on the right is invoked with the repository and a list -# of files to check. A non-zero exit of the filter program will -# cause the commit to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/config b/CVSROOT/config deleted file mode 100644 index ff43ec0..0000000 --- a/CVSROOT/config +++ /dev/null @@ -1,14 +0,0 @@ -# Set this to "no" if pserver shouldn't check system users/passwords -#SystemAuth=no - -# Put CVS lock files in this directory rather than directly in the repository. -#LockDir=/var/lock/cvs - -# Set `TopLevelAdmin' to `yes' to create a CVS directory at the top -# level of the new working directory when using the `cvs checkout' -# command. -#TopLevelAdmin=no - -# Set `LogHistory' to `all' or `TOFEWGCMAR' to log all transactions to the -# history file, or a subset as needed (ie `TMAR' logs all write operations) -#LogHistory=TOFEWGCMAR diff --git a/CVSROOT/cvswrappers b/CVSROOT/cvswrappers deleted file mode 100644 index 0accaf1..0000000 --- a/CVSROOT/cvswrappers +++ /dev/null @@ -1,23 +0,0 @@ -# This file affects handling of files based on their names. -# -# The -t/-f options allow one to treat directories of files -# as a single file, or to transform a file in other ways on -# its way in and out of CVS. -# -# The -m option specifies whether CVS attempts to merge files. -# -# The -k option specifies keyword expansion (e.g. -kb for binary). -# -# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers) -# -# wildcard [option value][option value]... -# -# where option is one of -# -f from cvs filter value: path to filter -# -t to cvs filter value: path to filter -# -m update methodology value: MERGE or COPY -# -k expansion mode value: b, o, kkv, &c -# -# and value is a single-quote delimited value. -# For example: -#*.gif -k 'b' diff --git a/CVSROOT/editinfo b/CVSROOT/editinfo deleted file mode 100644 index d78886c..0000000 --- a/CVSROOT/editinfo +++ /dev/null @@ -1,21 +0,0 @@ -# The "editinfo" file is used to allow verification of logging -# information. It works best when a template (as specified in the -# rcsinfo file) is provided for the logging procedure. Given a -# template with locations for, a bug-id number, a list of people who -# reviewed the code before it can be checked in, and an external -# process to catalog the differences that were code reviewed, the -# following test can be applied to the code: -# -# Making sure that the entered bug-id number is correct. -# Validating that the code that was reviewed is indeed the code being -# checked in (using the bug-id number or a seperate review -# number to identify this particular code set.). -# -# If any of the above test failed, then the commit would be aborted. -# -# Actions such as mailing a copy of the report to each reviewer are -# better handled by an entry in the loginfo file. -# -# One thing that should be noted is the the ALL keyword is not -# supported. There can be only one entry that matches a given -# repository. diff --git a/CVSROOT/loginfo b/CVSROOT/loginfo deleted file mode 100644 index 5a59f0a..0000000 --- a/CVSROOT/loginfo +++ /dev/null @@ -1,26 +0,0 @@ -# The "loginfo" file controls where "cvs commit" log information -# is sent. The first entry on a line is a regular expression which must match -# the directory that the change is being made to, relative to the -# $CVSROOT. If a match is found, then the remainder of the line is a filter -# program that should expect log information on its standard input. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name ALL appears as a regular expression it is always used -# in addition to the first matching regex or DEFAULT. -# -# You may specify a format string as part of the -# filter. The string is composed of a `%' followed -# by a single format character, or followed by a set of format -# characters surrounded by `{' and `}' as separators. The format -# characters are: -# -# s = file name -# V = old version number (pre-checkin) -# v = new version number (post-checkin) -# -# For example: -#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog -# or -#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog diff --git a/CVSROOT/modules b/CVSROOT/modules deleted file mode 100644 index cb9e9ef..0000000 --- a/CVSROOT/modules +++ /dev/null @@ -1,26 +0,0 @@ -# Three different line formats are valid: -# key -a aliases... -# key [options] directory -# key [options] directory files... -# -# Where "options" are composed of: -# -i prog Run "prog" on "cvs commit" from top-level of module. -# -o prog Run "prog" on "cvs checkout" of module. -# -e prog Run "prog" on "cvs export" of module. -# -t prog Run "prog" on "cvs rtag" of module. -# -u prog Run "prog" on "cvs update" of module. -# -d dir Place module in directory "dir" instead of module name. -# -l Top-level directory only -- do not recurse. -# -# NOTE: If you change any of the "Run" options above, you'll have to -# release and re-checkout any working directories of these modules. -# -# And "directory" is a path to a directory relative to $CVSROOT. -# -# The "-a" option specifies an alias. An alias is interpreted as if -# everything on the right of the "-a" had been typed on the command line. -# -# You can encode a module within a module by using the special '&' -# character to interpose another module into the current module. This -# can be useful for creating a module that consists of many directories -# spread out over the entire source repository. diff --git a/CVSROOT/notify b/CVSROOT/notify deleted file mode 100644 index 34f0bc2..0000000 --- a/CVSROOT/notify +++ /dev/null @@ -1,12 +0,0 @@ -# The "notify" file controls where notifications from watches set by -# "cvs watch add" or "cvs edit" are sent. The first entry on a line is -# a regular expression which is tested against the directory that the -# change is being made to, relative to the $CVSROOT. If it matches, -# then the remainder of the line is a filter program that should contain -# one occurrence of %s for the user to notify, and information on its -# standard input. -# -# "ALL" or "DEFAULT" can be used in place of the regular expression. -# -# For example: -#ALL mail %s -s "CVS notification" diff --git a/CVSROOT/rcsinfo b/CVSROOT/rcsinfo deleted file mode 100644 index 49e59f4..0000000 --- a/CVSROOT/rcsinfo +++ /dev/null @@ -1,13 +0,0 @@ -# The "rcsinfo" file is used to control templates with which the editor -# is invoked on commit and import. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being made to, relative to the -# $CVSROOT. For the first match that is found, then the remainder of the -# line is the name of the file that contains the template. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/taginfo b/CVSROOT/taginfo deleted file mode 100644 index 274a46d..0000000 --- a/CVSROOT/taginfo +++ /dev/null @@ -1,20 +0,0 @@ -# The "taginfo" file is used to control pre-tag checks. -# The filter on the right is invoked with the following arguments: -# -# $1 -- tagname -# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d -# $3 -- repository -# $4-> file revision [file revision ...] -# -# A non-zero exit of the filter program will cause the tag to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/verifymsg b/CVSROOT/verifymsg deleted file mode 100644 index 86f747c..0000000 --- a/CVSROOT/verifymsg +++ /dev/null @@ -1,21 +0,0 @@ -# The "verifymsg" file is used to allow verification of logging -# information. It works best when a template (as specified in the -# rcsinfo file) is provided for the logging procedure. Given a -# template with locations for, a bug-id number, a list of people who -# reviewed the code before it can be checked in, and an external -# process to catalog the differences that were code reviewed, the -# following test can be applied to the code: -# -# Making sure that the entered bug-id number is correct. -# Validating that the code that was reviewed is indeed the code being -# checked in (using the bug-id number or a seperate review -# number to identify this particular code set.). -# -# If any of the above test failed, then the commit would be aborted. -# -# Actions such as mailing a copy of the report to each reviewer are -# better handled by an entry in the loginfo file. -# -# One thing that should be noted is the the ALL keyword is not -# supported. There can be only one entry that matches a given -# repository. diff --git a/pyserial/CHANGES.txt b/pyserial/CHANGES.txt deleted file mode 100644 index 7f93e64..0000000 --- a/pyserial/CHANGES.txt +++ /dev/null @@ -1,158 +0,0 @@ -Version 1.0 13 Feb 2002 - First public release. - Split from the pybsl application (see mspgcc.sourceforge.net) - - New Features: - - Added Jython support - -Version 1.1 14 Feb 2002 - Bugfixes: - - Win32, when not specifying a timeout - - Typos in the Docs - - New Features: - - added serialutil which provides a base class for the Serial - objects. - - - readline, readlines, writelines and flush are now supported - see README.txt for deatils. - -Version 1.11 14 Feb 2002 - Same as 1.1 but added missing files. - -Version 1.12 18 Feb 2002 - Removed unneded constants to fix RH7.x problems. - -Version 1.13 09 Apr 2002 - Added alternate way for enabling rtscts (CNEW_RTSCTS is tried too) - If port opening fails, a SerialException is raised on all platforms - -Version 1.14 29 May 2002 - Added examples to archive - Added non-blocking mode for timeout=0 (tnx Mat Martineau) - - Bugfixes: - - win32 does now return the remaining characters on timeout - -Version 1.15 04 Jun 2002 - Bugfixes (win32): - - removed debug messages - - compatibility to win9x improved - -Version 1.16 02 Jul 2002 - Added implementation of RI and corrected RTS/CTS on Win32 - -Version 1.17 03 Jul 2002 - Silly mix of two versions in win32 code corrected - -Version 1.18 06 Dec 2002 - Bugfixes (general): - - remove the mapping of flush to the destructive flushOutput as - this is not the expected behaviour. - - readline: EOL character for lines can be chosen idea by - John Florian. - Bugfixes (posix): - - cygwin port numbering fixed - - test each and every constant for it's existence in termios module, - use default if not existent (fix for Bug item #640214) - - wrong exception on nonexitstent ports with /dev file. bug report - by Louis Cordier - Bugfixes (win32): - - RTS/CTS handling as sugested in Bug #635072 - - bugfix of timeouts brought up by Markus Hoffrogge - -Version 1.19 19 Mar 2003 - Bugfixes (posix): - - removed dgux entry which actualy had a wrong comment and is - probably not in use anywhere. - Bugfixes (win32): - - added int() conversion, [Bug 702120] - - remove code to set control lines in close methond of win32 - version. [Bug 669625] - -Version 1.20 28 Aug 2003 - Added serial.device() for all platforms - Bugfixes (win32): - - don't recreate opverlaped structures and events on each - read/write. - - don't set unneded event masks. - - dont use DOS device names for ports > 9. - - remove send timeout (its not used in the linux impl. anyway). - - -Version 1.21 30 sep 2003 - Bugfixes (win32): - - name for COM10 was not built correctly, found by Norm Davis. - Bugfixes (examples): - - small change in miniterm.py that should mage it run on cygwin, - [Bug 809904] submitted by Rolf Campbell. - -Version 2.0b1 1 Oct 2003 - Transition to the 2.0 series: - - New implementation only supports Python 2.2+, backwards compatibility - should be maintained almost everywhere. - The OS handles (like the hComPort or fd attribute) were prefixed with an - underscore. The different names stay, as anyone that uses one of these - has to write platform specific code anyway. - - Common base class serialutil.SerialBase for all implementations. - - PARITY_NONE, PARITY_EVEN, PARITY_ODD constants changed and all these - constants moved to serialutil.py (still available as serial.PARITY_NONE - etc. and they should be used that way) - - Added serial.PARITY_NAMES (implemented in serialutil.PARITY_NAMES). - This dictionary can be used to convert parity constants to meaningful - strings. - - Each Serial class and instance has a list of supported values: - BAUDRATES, BYTESIZES, PARITIES, STOPBITS - (i.e. serial.Serial.BAUDRATES or s = serial.Serial; s.BAUDRATES) - these values can be used to fill in value sin GUI dialogs etc. - - Creating a Serial() object without port spec returns an unconfigured, - closed port. Useful if a GUI dialog should take a port and configure - it. - - New methods for serial.Serial instances: open(), isOpen() - - A port can be opened and closed as many times as desired. - - Instances of serial.Serial have baudrate, bytesize, timeout etc. - attributes implemented as properties, all can be set while the port is - opened. It will then be reconfigured. - - Improved __doc__'s. - - New test_advanced.py for the property setting/getting testing. - - Small bugfix on posix with get* methods (return value should be true a - boolean). - - added a __repr__ that returns a meaningful string will all the serial - setting, easy for debugging. - - The serialposix module does not throw an exception on unsupported - platforms, the message is still printed. The idea that it may still - work even if the platform itself s not known, it simply tries to do - the posix stuff anyway (It's likely that opening ports by number - fails, but by name it should work). - -Version 2.0b2 4 Oct 2003 - - Added serial port configuration dialog for wxPython to the examples. - - Added terminal application for wxPython with wxGlade design file - to the examples. - - Jython support is currenty broken as Jython does not have a Python 2.2 - compatible release out yet - -Version 2.0 6 Nov 2003 - - Fixes setup.py for older distutils - -Version 2.1 28 Jul 2004 - Bugfixes: - - Fix XON/XOFF values [Bug 975250] - Bugfixes (posix): - - fd == 0 fix from Vsevolod Lobko - - netbsd fixes from Erik Lindgren - - Dynamicaly lookup baudrates and some cleanups - Bugfixes (examples): - - CRLF handling of miniterm.py should be more consistent on Win32 - and others. Added LF only command line option - - Mutithreading fixes to wxTerminal.py (helps with wxGTK) - - Small change for wxPython 2.5 in wxSerialConfigDialog.py [Bug 994856] - - New Features: - - Implement write timeouts ('writeTimeout' parameter) - - -Version 2.2 XXXX - Bugfixes (win32): - - keep RTS/CTS state on port setting changes [Patch 983106] - diff --git a/pyserial/LICENSE.txt b/pyserial/LICENSE.txt deleted file mode 100644 index 12eddd3..0000000 --- a/pyserial/LICENSE.txt +++ /dev/null @@ -1,61 +0,0 @@ -Copyright (c) 2001-2004 Chris Liechti <cliechti@gmx.net>; -All Rights Reserved. - -This is the Python license. In short, you can use this product in -commercial and non-commercial applications, modify it, redistribute it. -A notification to the author when you use and/or modify it is welcome. - - -TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING THIS SOFTWARE -=================================================================== - -LICENSE AGREEMENT ------------------ - -1. This LICENSE AGREEMENT is between the copyright holder of this -product, and the Individual or Organization ("Licensee") accessing -and otherwise using this product in source or binary form and its -associated documentation. - -2. Subject to the terms and conditions of this License Agreement, -the copyright holder hereby grants Licensee a nonexclusive, -royalty-free, world-wide license to reproduce, analyze, test, -perform and/or display publicly, prepare derivative works, distribute, -and otherwise use this product alone or in any derivative version, -provided, however, that copyright holders License Agreement and -copyright holders notice of copyright are retained in this product -alone or in any derivative version prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates this product or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to this product. - -4. The copyright holder is making this product available to Licensee on -an "AS IS" basis. THE COPYRIGHT HOLDER MAKES NO REPRESENTATIONS OR -WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, -THE COPYRIGHT HOLDER MAKES NO AND DISCLAIMS ANY REPRESENTATION OR -WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR -THAT THE USE OF THIS PRODUCT WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. - -5. THE COPYRIGHT HOLDER SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER -USERS OF THIS PRODUCT FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL -DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE -USING THIS PRODUCT, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE -POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between the -copyright holder and Licensee. This License Agreement does not grant -permission to use trademarks or trade names from the copyright holder -in a trademark sense to endorse or promote products or services of -Licensee, or any third party. - -8. By copying, installing or otherwise using this product, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - diff --git a/pyserial/MANIFEST b/pyserial/MANIFEST deleted file mode 100644 index c702a42..0000000 --- a/pyserial/MANIFEST +++ /dev/null @@ -1,20 +0,0 @@ -README.txt -LICENSE.txt -CHANGES.txt -setup.py -serial\__init__.py -serial\serialjava.py -serial\serialposix.py -serial\serialwin32.py -serial\serialutil.py -examples\miniterm.py -examples\tcp_serial_redirect.py -examples\test.py -examples\test_advanced.py -examples\scan.py -examples\enhancedserial.py -examples\wxSerialConfigDialog.py -examples\wxSerialConfigDialog.wxg -examples\wxTerminal.py -examples\wxTerminal.wxg -examples\setup_demo.py diff --git a/pyserial/README.txt b/pyserial/README.txt deleted file mode 100644 index 522c1d5..0000000 --- a/pyserial/README.txt +++ /dev/null @@ -1,244 +0,0 @@ -pySerial --------- -This module capsulates the access for the serial port. It provides backends -for standard Python running on Windows, Linux, BSD (possibly any POSIX -compilant system) and Jython. The module named "serial" automaticaly selects -the appropriate backend. - -It is released under a free software license, see LICENSE.txt for more -details. - -Project Homepage: pyserial.sourceforge.net -(C) 2001-2004 Chris Liechti <cliechti@gmx.net> - - -Features --------- -- same class based interface on all supported platforms -- access to the port settings trough Python 2.2 properties -- port numbering starts at zero, no need to know the platform dependant port - name in the user program -- port name can be specified if access through numbering is inappropriate -- support for different bytesizes, stopbits, parity and flow control - with RTS/CTS and/or Xon/Xoff -- working with or without receive timeout, blocking or non-blocking -- file like API with "read" and "write" ("readline" etc. also supported) -- The files in this package are 100% pure Python. - They depend on non standard but common packages on Windows (win32all) and - Jython (JavaComm). POSIX (Linux, BSD) uses only modules from the standard - Python distribution) -- The port is set up for binary transmission. No NULL byte stripping, CR-LF - translation etc. (which are many times enabled for POSIX.) This makes this - module universally useful. - - -Requirements ------------- -- Python 2.2 or newer -- win32all extensions on Windows -- "Java Communications" (JavaComm) extension for Java/Jython - - -Installation ------------- -Extract files from the archive, open a shell/console in that directory and -let Distutils do the rest: "python setup.py install" - -The files get installed in the "Lib/site-packages" directory. - -There is also a Windows installer, but for developers it may be interesting -to get the source archive anyway, because it contains examples and the readme. - -Do also have a look at the example files in the examples directory in the -source distribution or online in CVS repository. - -Serial to USB adapters ----------------------- -Such adapters are reported to work under Mac OSX and Windows. They are -mapped to a normal COM port under Windows, but on Mac OSX and other platforms -they have special device names. - -Mac OSX: "/dev/[cu|tty].USA<adaptername><USB-part>P<serial-port>.1" - e.g. "/dev/cu.USA19QW11P1.1" - -Linux: "/dev/usb/ttyUSB[n]" or "/dev/ttyUSB[n]" - first for for RedHat, second form for Debian. - e.g. "/dev/usb/ttyUSB0" - -Either use these names for the serial ports or create a link to the common device -names like "ln -s /dev/cu.USA19QW11P1.1 /dev/cuaa0" or "ln -s /dev/usb/ttyUSB0 -/dev/ttyS4" etc. - -But be aware that the (USB) device file disappears as soon as you unplug the USB -adapter. - - -Short introduction ------------------- -Open port 0 at "9600,8,N,1", no timeout ->>> import serial ->>> ser = serial.Serial(0) #open first serial port ->>> print ser.portstr #check which port was realy used ->>> ser.write("hello") #write a string ->>> ser.close() #close port - -Open named port at "19200,8,N,1", 1s timeout ->>> ser = serial.Serial('/dev/ttyS1', 19200, timeout=1) ->>> x = ser.read() #read one byte ->>> s = ser.read(10) #read up to ten bytes (timeout) ->>> line = ser.readline() #read a '\n' terminated line ->>> ser.close() - -Open second port at "38400,8,E,1", non blocking HW handshaking ->>> ser = serial.Serial(1, 38400, timeout=0, -... parity=serial.PARITY_EVEN, rtscts=1) ->>> s = ser.read(100) #read up to one hunded bytes -... #or as much is in the buffer - -Get a Serial instance and configure/open it later ->>> ser = serial.Serial() ->>> ser.baudrate = 19200 ->>> ser.port = 0 ->>> ser -Serial<id=0xa81c10, open=False>(port='COM1', baudrate=19200, bytesize=8, -parity='N', stopbits=1, timeout=None, xonxoff=0, rtscts=0) ->>> ser.open() ->>> ser.isOpen() -True ->>> ser.close() ->>> ser.isOpen() -False - -Be carefully when using "readline". Do specify a timeout when -opening the serial port otherwise it could block forever if -no newline character is received. Also note that "readlines" only -works with a timeout. "readlines" depends on having a timeout -and interprets that as EOF (end of file). It raises an exception -if the port is not opened correctly. - - -Parameters for the Serial class -------------------------------- -ser = serial.Serial( - port=None, #number of device, numbering starts at - #zero. if everything fails, the user - #can specify a device string, note - #that this isn't portable anymore - #if no port is specified an unconfigured - #an closed serial port object is created - baudrate=9600, #baudrate - bytesize=EIGHTBITS, #number of databits - parity=PARITY_NONE, #enable parity checking - stopbits=STOPBITS_ONE, #number of stopbits - timeout=None, #set a timeout value, None to wait forever - xonxoff=0, #enable software flow control - rtscts=0, #enable RTS/CTS flow control - writeTimeout=None, #set a timeout for writes -) - -The port is immediately opened on object creation, if a port is given. -It is not opened if port is None. - -Options for read timeout: -timeout=None #wait forever -timeout=0 #non-blocking mode (return immediately on read) -timeout=x #set timeout to x seconds (float allowed) - -Options for write timeout: -writeTimeout=x #will rise a SerialTimeoutException if the data - #cannot be sent in x seconds - -Methods of Serial instances ---------------------------- -open() #open port -close() #close port immediately -setBaudrate(baudrate) #change baudarte on an open port -inWaiting() #return the number of chars in the receive buffer -read(size=1) #read "size" characters -write(s) #write the string s to the port -flushInput() #flush input buffer, discarding all it's contents -flushOutput() #flush output buffer, abort output -sendBreak() #send break condition -setRTS(level=1) #set RTS line to specified logic level -setDTR(level=1) #set DTR line to specified logic level -getCTS() #return the state of the CTS line -getDSR() #return the state of the DSR line -getRI() #return the state of the RI line -getCD() #return the state of the CD line - -Attributes of Serial instances ------------------------------- -Read Only: -portstr #device name -BAUDRATES #list of valid baudrates -BYTESIZES #list of valid byte sizes -PARITIES #list of valid parities -STOPBITS #list of valid stop bit widths - -New values can be assigned to the following attribues, the port -will be reconfigured, even if it's opened at that time (port will be -closed and reopened to apply the changes): -port #port name/number as set by the user -baudrate #current baudrate setting -bytesize #bytesize in bits -parity #parity setting -stopbits #stop bit with (1,2) -timeout #read timeout setting -xonxoff #if Xon/Xoff flow control is enabled -rtscts #if hardware flow control is enabled -writeTimeout #write timeout setting - -These attribues also have corresponding getX and setXX methods. - -Exceptions ----------- -serial.SerialException - -Constants ---------- -parity: - serial.PARITY_NONE - serial.PARITY_EVEN - serial.PARITY_ODD -stopbits: - serial.STOPBITS_ONE - serial.STOPBITS_TWO -bytesize: - serial.FIVEBITS - serial.SIXBITS - serial.SEVENBITS - serial.EIGHTBITS - -Xon/Xoff characters: - serial.XON - serial.XOFF - -Tips & Tricks -------------- -- Some protocols need CR LF ("\r\n") as line terminator, not just LF ("\n"). - Telephone modems with the AT command set are an example of this behaviour. - -- Scanning for available serial ports is possible with more or less success on - some platforms. Look at the tools from Roger Binns: - http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/bitpim/comscan/ - -- When packaging a project with py2exe, it will likely print a warning about - missing modules 'javax.comm'. This warning is uncritical as the module is - used in the Jython implementation that is not used but packaged. - - It can be avoided with: - setup(... - options = {'py2exe': {'excludes': ['javax.comm']}}) - - See also setup_demo.py in the examples. - - -References ----------- -- Python: http://www.python.org -- Jython: http://www.jython.org -- win32all: http://starship.python.net/crew/mhammond/ - and http://www.activestate.com/Products/ActivePython/win32all.html -- Java@IBM http://www-106.ibm.com/developerworks/java/jdk/ - (JavaComm links are on the download page for the respective platform jdk) -- Java@SUN http://java.sun.com/products/ diff --git a/pyserial/examples/enhancedserial.py b/pyserial/examples/enhancedserial.py deleted file mode 100644 index 2c81ae1..0000000 --- a/pyserial/examples/enhancedserial.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python -"""Enhanced Serial Port class -part of pyserial (http://pyserial.sf.net) (C)2002 cliechti@gmx.net - -another implementation of the readline and readlines method. -this one should be more efficient because a bunch of characters are read -on each access, but the drawback is that a timeout must be specified to -make it work (enforced by the class __init__). - -this class could be enhanced with a read_until() method and more -like found in the telnetlib. -""" - -from serial import Serial - -class EnhancedSerial(Serial): - def __init__(self, *args, **kwargs): - #ensure that a reasonable timeout is set - timeout = kwargs.get('timeout',0.1) - if timeout < 0.01: timeout = 0.1 - kwargs['timeout'] = timeout - Serial.__init__(self, *args, **kwargs) - self.buf = '' - - def readline(self, maxsize=None, timeout=1): - """maxsize is ignored, timeout in seconds is the max time that is way for a complete line""" - tries = 0 - while 1: - self.buf += self.read(512) - pos = self.buf.find('\n') - if pos >= 0: - line, self.buf = self.buf[:pos+1], self.buf[pos+1:] - return line - tries += 1 - if tries * self.timeout > timeout: - break - line, self.buf = self.buf, '' - return line - - def readlines(self, sizehint=None, timeout=1): - """read all lines that are available. abort after timout - when no more data arrives.""" - lines = [] - while 1: - line = self.readline(timeout=timeout) - if line: - lines.append(line) - if not line or line[-1:] != '\n': - break - return lines - -if __name__=='__main__': - #do some simple tests with a Loopback HW (see test.py for details) - PORT = 0 - #test, only with Loopback HW (shortcut RX/TX pins (3+4 on DSUB 9 and 25) ) - s = EnhancedSerial(PORT) - #write out some test data lines - s.write('\n'.join("hello how are you".split())) - #and read them back - print s.readlines() - #this one should print an empty list - print s.readlines(timeout=0.4) diff --git a/pyserial/examples/miniterm.py b/pyserial/examples/miniterm.py deleted file mode 100644 index 454e1f4..0000000 --- a/pyserial/examples/miniterm.py +++ /dev/null @@ -1,165 +0,0 @@ -#!/usr/bin/env python - -# Very simple serial terminal -# (C)2002-2004 Chris Liechti <cliecht@gmx.net> - -# Input characters are sent directly (only LF -> CR/LF/CRLF translation is -# done), received characters are displayed as is (or as trough pythons -# repr, useful for debug purposes) -# Baudrate and echo configuartion is done through globals - - -import sys, os, serial, threading, getopt - -EXITCHARCTER = '\x04' #ctrl+D - -#first choose a platform dependant way to read single characters from the console -if os.name == 'nt': - import msvcrt - def getkey(): - while 1: - if echo: - z = msvcrt.getche() - else: - z = msvcrt.getch() - if z == '\0' or z == '\xe0': #functions keys - msvcrt.getch() - else: - if z == '\r': - return '\n' - return z - -elif os.name == 'posix': - import termios, sys, os - fd = sys.stdin.fileno() - old = termios.tcgetattr(fd) - new = termios.tcgetattr(fd) - new[3] = new[3] & ~termios.ICANON & ~termios.ECHO - new[6][termios.VMIN] = 1 - new[6][termios.VTIME] = 0 - termios.tcsetattr(fd, termios.TCSANOW, new) - s = '' # We'll save the characters typed and add them to the pool. - def getkey(): - c = os.read(fd, 1) - #~ c = sys.stdin.read(1) - if echo: sys.stdout.write(c); sys.stdout.flush() - return c - def clenaup_console(): - termios.tcsetattr(fd, termios.TCSAFLUSH, old) - sys.exitfunc = clenaup_console #terminal modes have to be restored on exit... - -else: - raise "Sorry no implementation for your platform (%s) available." % sys.platform - -CONVERT_CRLF = 2 -CONVERT_CR = 1 -CONVERT_LF = 0 - -def reader(): - """loop forever and copy serial->console""" - while 1: - data = s.read() - if repr_mode: - sys.stdout.write(repr(data)[1:-1]) - else: - sys.stdout.write(data) - sys.stdout.flush() - -def writer(): - """loop and copy console->serial until EOF character is found""" - while 1: - c = getkey() - if c == EXITCHARCTER: - break #exit app - elif c == '\n': - if convert_outgoing == CONVERT_CRLF: - s.write('\r\n') #make it a CR+LF - elif convert_outgoing == CONVERT_CR: - s.write('\r') #make it a CR - elif convert_outgoing == CONVERT_LF: - s.write('\n') #make it a LF - else: - s.write(c) #send character - - -#print a short help message -def usage(): - sys.stderr.write("""USAGE: %s [options] - Miniterm - A simple terminal program for the serial port. - - options: - -p, --port=PORT: port, a number, default = 0 or a device name - -b, --baud=BAUD: baudrate, default 9600 - -r, --rtscts: enable RTS/CTS flow control (default off) - -x, --xonxoff: enable software flow control (default off) - -e, --echo: enable local echo (default off) - -c, --cr: do not send CR+LF, send CR only - -n, --newline: do not send CR+LF, send LF only - -D, --debug: debug received data (escape nonprintable chars) - -""" % (sys.argv[0], )) - -if __name__ == '__main__': - #initialize with defaults - port = 0 - baudrate = 9600 - echo = 0 - convert_outgoing = CONVERT_CRLF - rtscts = 0 - xonxoff = 0 - repr_mode = 0 - - #parse command line options - try: - opts, args = getopt.getopt(sys.argv[1:], - "hp:b:rxecnD", - ["help", "port=", "baud=", "rtscts", "xonxoff", "echo", - "cr", "newline", "debug"] - ) - except getopt.GetoptError: - # print help information and exit: - usage() - sys.exit(2) - - for o, a in opts: - if o in ("-h", "--help"): #help text - usage() - sys.exit() - elif o in ("-p", "--port"): #specified port - try: - port = int(a) - except ValueError: - port = a - elif o in ("-b", "--baud"): #specified baudrate - try: - baudrate = int(a) - except ValueError: - raise ValueError, "Baudrate must be a integer number, not %r" % a - elif o in ("-r", "--rtscts"): - rtscts = 1 - elif o in ("-x", "--xonxoff"): - xonxoff = 1 - elif o in ("-e", "--echo"): - echo = 1 - elif o in ("-c", "--cr"): - convert_outgoing = CONVERT_CR - elif o in ("-n", "--newline"): - convert_outgoing = CONVERT_LF - elif o in ("-D", "--debug"): - repr_mode = 1 - - #open the port - try: - s = serial.Serial(port, baudrate, rtscts=rtscts, xonxoff=xonxoff) - except: - sys.stderr.write("Could not open port\n") - sys.exit(1) - sys.stderr.write("--- Miniterm --- type Ctrl-D to quit\n") - #start serial->console thread - r = threading.Thread(target=reader) - r.setDaemon(1) - r.start() - #and enter console->serial loop - writer() - - sys.stderr.write("\n--- exit ---\n") diff --git a/pyserial/examples/scan.py b/pyserial/examples/scan.py deleted file mode 100644 index 439818c..0000000 --- a/pyserial/examples/scan.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python -"""Scan for serial ports. -Part of pySerial (http://pyserial.sf.net) (C)2002-2003 <cliechti@gmx.net> - -The scan function of this module tries to open each port number -from 0 to 255 and it builds a list of those ports where this was -successful. -""" - -import serial - -def scan(): - """scan for available ports. return a list of tuples (num, name)""" - available = [] - for i in range(256): - try: - s = serial.Serial(i) - available.append( (i, s.portstr)) - s.close() #explicit close 'cause of delayed GC in java - except serial.SerialException: - pass - return available - -if __name__=='__main__': - print "Found ports:" - for n,s in scan(): - print "(%d) %s" % (n,s) diff --git a/pyserial/examples/setup_demo.py b/pyserial/examples/setup_demo.py deleted file mode 100644 index 854c0b9..0000000 --- a/pyserial/examples/setup_demo.py +++ /dev/null @@ -1,35 +0,0 @@ -# This is a setup.py example script for the use with py2exe -from distutils.core import setup -import py2exe -import sys, os - -#this script is only useful for py2exe so just run that distutils command. -#that allows to run it with a simple double click. -sys.argv.append('py2exe') - -#get an icon from somewhere.. the python installation should have one: -icon = os.path.join(os.path.dirname(sys.executable), 'py.ico') - -setup( - options = {'py2exe': { - 'excludes': ['javax.comm'], - 'optimize': 2, - 'dist_dir': 'dist', - } - }, - - name = "wxTerminal", - windows = [ - { - 'script': "wxTerminal.py", - 'icon_resources': [(0x0004, icon)] - }, - ], - zipfile = "stuff.lib", - - description = "Simple serial terminal application", - version = "0.1", - author = "Chris Liechti", - author_email = "cliechti@gmx.net", - url = "http://pyserial.sf.net", -) diff --git a/pyserial/examples/tcp_serial_redirect.py b/pyserial/examples/tcp_serial_redirect.py deleted file mode 100644 index e55d53a..0000000 --- a/pyserial/examples/tcp_serial_redirect.py +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/env python - -#(C)2002-2003 Chris Liechti <cliechti@gmx.net> -#redirect data from a TCP/IP connection to a serial port and vice versa -#requires Python 2.2 'cause socket.sendall is used - -"""USAGE: tcp_serial_redirect.py [options] -Simple Serial to Network (TCP/IP) redirector. - -Options: - -p, --port=PORT serial port, a number, defualt = 0 or a device name - -b, --baud=BAUD baudrate, default 9600 - -r, --rtscts enable RTS/CTS flow control (default off) - -x, --xonxoff enable software flow control (default off) - -P, --localport TCP/IP port on which to run the server (default 7777) - -Note: no security measures are implemeted. Anyone can remotely connect -to this service over the network. -Only one connection at once is supported. If the connection is terminaed -it waits for the next connect. -""" - -import sys, os, serial, threading, getopt, socket - -try: - True -except NameError: - True = 1 - False = 0 - -class Redirector: - def __init__(self, serial, socket): - self.serial = serial - self.socket = socket - - def shortcut(self): - """connect the serial port to the tcp port by copying everything - from one side to the other""" - self.alive = True - self.thread_read = threading.Thread(target=self.reader) - self.thread_read.setDaemon(1) - self.thread_read.start() - self.writer() - - def reader(self): - """loop forever and copy serial->socket""" - while self.alive: - try: - data = self.serial.read(1) #read one, blocking - n = self.serial.inWaiting() #look if there is more - if n: - data = data + self.serial.read(n) #and get as much as possible - if data: - self.socket.sendall(data) #send it over TCP - except socket.error, msg: - print msg - #probably got disconnected - break - self.alive = False - - def writer(self): - """loop forever and copy socket->serial""" - while self.alive: - try: - data = self.socket.recv(1024) - if not data: - break - self.serial.write(data) #get a bunch of bytes and send them - except socket.error, msg: - print msg - #probably got disconnected - break - self.alive = False - self.thread_read.join() - - def stop(self): - """Stop copying""" - if self.alive: - self.alive = False - self.thread_read.join() - -if __name__ == '__main__': - ser = serial.Serial() - - #parse command line options - try: - opts, args = getopt.getopt(sys.argv[1:], - "hp:b:rxP", - ["help", "port=", "baud=", "rtscts", "xonxoff", "localport"]) - except getopt.GetoptError: - # print help information and exit: - print >>sys.stderr, __doc__ - sys.exit(2) - - ser.port = 0 - ser.baudrate = 9600 - ser.rtscts = False - ser.xonxoff = False - ser.timeout = 1 #required so that the reader thread can exit - - localport = 7777 - for o, a in opts: - if o in ("-h", "--help"): #help text - usage() - sys.exit() - elif o in ("-p", "--port"): #specified port - try: - ser.port = int(a) - except ValueError: - ser.port = a - elif o in ("-b", "--baud"): #specified baudrate - try: - ser.baudrate = int(a) - except ValueError: - raise ValueError, "Baudrate must be a integer number" - elif o in ("-r", "--rtscts"): - ser.rtscts = True - elif o in ("-x", "--xonxoff"): - ser.xonxoff = True - elif o in ("-P", "--localport"): - try: - localport = int(a) - except ValueError: - raise ValueError, "Local port must be an integer number" - - print "--- TCP/IP to Serial redirector --- type Ctrl-C / BREAK to quit" - - try: - ser.open() - except serial.SerialException, e: - print "Could not open serial port %s: %s" % (ser.portstr, e) - sys.exit(1) - - srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - srv.bind( ('', localport) ) - srv.listen(1) - while 1: - try: - print "Waiting for connection..." - connection, addr = srv.accept() - print 'Connected by', addr - #enter console->serial loop - r = Redirector(ser, connection) - r.shortcut() - print 'Disconnected' - connection.close() - except socket.error, msg: - print msg - - print "\n--- exit ---" diff --git a/pyserial/examples/test.py b/pyserial/examples/test.py deleted file mode 100644 index 96bd3ee..0000000 --- a/pyserial/examples/test.py +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env python -#Python Serial Port Extension for Win32, Linux, BSD, Jython -#see __init__.py -# -#(C) 2001-2003 Chris Liechti <cliechti@gmx.net> -# this is distributed under a free software license, see license.txt - -"""Some tests for the serial module. -Part of pyserial (http://pyserial.sf.net) (C)2002-2003 cliechti@gmx.net - -Intended to be run on different platforms, to ensure portability of -the code. - -For all these tests a simple hardware is required. -Loopback HW adapter: -Shortcut these pin pairs: - TX <-> RX - RTS <-> CTS - DTR <-> DSR - -On a 9 pole DSUB these are the pins (2-3) (4-6) (7-8) -""" - -import unittest, threading, time -import serial - -#on which port should the tests be performed: -PORT=0 - - -class Test4_Nonblocking(unittest.TestCase): - """Test with timeouts""" - timeout=0 - def setUp(self): - self.s = serial.Serial(PORT,timeout=self.timeout) - def tearDown(self): - self.s.close() - - def test0_Messy(self): - """NonBlocking (timeout=0)""" - #this is only here to write out the message in verbose mode - #because Test3 and Test4 print the same messages - - def test1_ReadEmpty(self): - """timeout: After port open, the input buffer must be empty""" - self.failUnless(self.s.read(1)=='', "expected empty buffer") - def test2_Loopback(self): - """timeout: each sent character should return (binary test). - this is also a test for the binary capability of a port.""" - for c in map(chr,range(256)): - self.s.write(c) - time.sleep(0.02) #there might be a small delay until the character is ready (especialy on win32) - self.failUnless(self.s.inWaiting()==1, "expected exactly one character for inWainting()") - self.failUnless(self.s.read(1)==c, "expected a '%s' which was written before" % c) - self.failUnless(self.s.read(1)=='', "expected empty buffer after all sent chars are read") - def test2_LoopbackTimeout(self): - """timeout: test the timeout/immediate return. - partial results should be returned.""" - self.s.write("HELLO") - time.sleep(0.02) #there might be a small delay until the character is ready (especialy on win32) - #read more characters as are available to run in the timeout - self.failUnless(self.s.read(10)=='HELLO', "expected an 'HELLO' which was written before") - self.failUnless(self.s.read(1)=='', "expected empty buffer after all sent chars are read") - - -class Test3_Timeout(Test4_Nonblocking): - """Same tests as the NonBlocking ones but this time with timeout""" - timeout=1 - def test0_Messy(self): - """Blocking (timeout=1)""" - #this is only here to write out the message in verbose mode - #because Test3 and Test4 print the same messages - -class SendEvent(threading.Thread): - def __init__(self, serial, delay=1): - threading.Thread.__init__(self) - self.serial = serial - self.delay = delay - self.x = threading.Event() - self.stopped = 0 - self.start() - def run(self): - time.sleep(self.delay) - if not self.stopped: - self.serial.write("E") - self.x.set() - def isSet(self): - return self.x.isSet() - def stop(self): - self.stopped = 1 - self.x.wait() - -class Test1_Forever(unittest.TestCase): - """Tests a port with no timeout. These tests require that a - character is sent after some time to stop the test, this is done - through the SendEvent class and the Loopback HW.""" - def setUp(self): - self.s = serial.Serial(PORT, timeout=None) - self.event = SendEvent(self.s) - def tearDown(self): - self.event.stop() - self.s.close() - - def test2_ReadEmpty(self): - """no timeout: after port open, the input buffer must be empty (read). - a character is sent after some time to terminate the test (SendEvent).""" - c = self.s.read(1) - if not (self.event.isSet() and c == 'E'): - self.fail("expected marker") - -class Test2_Forever(unittest.TestCase): - """Tests a port with no timeout""" - def setUp(self): - self.s = serial.Serial(PORT,timeout=None) - def tearDown(self): - self.s.close() - - def test1_inWaitingEmpty(self): - """no timeout: after port open, the input buffer must be empty (inWaiting)""" - self.failUnless(self.s.inWaiting()==0, "expected empty buffer") - - def test2_Loopback(self): - """no timeout: each sent character should return (binary test). - this is also a test for the binary capability of a port.""" - for c in map(chr,range(256)): - self.s.write(c) - time.sleep(0.02) #there might be a small delay until the character is ready (especialy on win32) - self.failUnless(self.s.inWaiting()==1, "expected exactly one character for inWainting()") - self.failUnless(self.s.read(1)==c, "expected an '%s' which was written before" % c) - self.failUnless(self.s.inWaiting()==0, "expected empty buffer after all sent chars are read") - - -class Test0_DataWires(unittest.TestCase): - """Test modem control lines""" - def setUp(self): - self.s = serial.Serial(PORT) - def tearDown(self): - self.s.close() - - def test1_RTS(self): - """Test RTS/CTS""" - self.s.setRTS(0) - self.failUnless(self.s.getCTS()==0, "CTS -> 0") - self.s.setRTS(1) - self.failUnless(self.s.getCTS()==1, "CTS -> 1") - - def test2_DTR(self): - """Test DTR/DSR""" - self.s.setDTR(0) - self.failUnless(self.s.getDSR()==0, "DSR -> 0") - self.s.setDTR(1) - self.failUnless(self.s.getDSR()==1, "DSR -> 1") - - def test3_RI(self): - """Test RI""" - self.failUnless(self.s.getRI()==0, "RI -> 0") - -class Test_MoreTimeouts(unittest.TestCase): - """Test with timeouts""" - def setUp(self): - self.s = serial.Serial() #create an closed serial port - - def tearDown(self): - self.s.close() - - def test_WriteTimeout(self): - """Test write() timeout.""" - #use xonxoff setting and the loopback adapter to switch traffic on hold - self.s.port = PORT - self.s.writeTimeout = 1 - self.s.xonxoff = 1 - self.s.open() - self.s.write(serial.XOFF) - time.sleep(0.1) #some systems need a little delay so that they can react on XOFF - t1 = time.time() - self.failUnlessRaises(serial.SerialTimeoutException, self.s.write, "timeout please"*100) - t2 = time.time() - self.failUnless( 1 <= (t2-t1) < 2, "Timeout not in the given intervall (%s)" % (t2-t1)) - -if __name__ == '__main__': - import sys - print __doc__ - print "Testing port", PORT - sys.argv.append('-v') - # When this module is executed from the command-line, it runs all its tests - unittest.main() diff --git a/pyserial/examples/test_advanced.py b/pyserial/examples/test_advanced.py deleted file mode 100644 index a966c2f..0000000 --- a/pyserial/examples/test_advanced.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env python -#needs at least python 2.2.3 - -#Python Serial Port Extension for Win32, Linux, BSD, Jython -#see __init__.py -# -#(C) 2001-2003 Chris Liechti <cliechti@gmx.net> -# this is distributed under a free software license, see license.txt - -"""Some tests for the serial module. -Part of pyserial (http://pyserial.sf.net) (C)2002 cliechti@gmx.net - -Intended to be run on different platforms, to ensure portability of -the code. - -These tests open a serial port and change all the settings on the fly. -If the port is realy correctly configured cannot be determined - that -would require external hardware or a nullmodem cable and an other -serial port library... Thus it mainly tests that all features are -correctly implemented and that the interface does what it should. -""" - -import unittest -import serial - -#on which port should the tests be performed: -PORT=0 - -class Test_ChangeAttributes(unittest.TestCase): - """Test with timeouts""" - - def setUp(self): - self.s = serial.Serial() #create an closed serial port - - def tearDown(self): - self.s.close() - - def test_PortSetting(self): - self.s.port = PORT - #portstr has to be set - self.failUnlessEqual(self.s.portstr, serial.device(PORT)) - #test internals - self.failUnlessEqual(self.s._port, PORT) - #test on the fly change - self.s.open() - self.failUnless(self.s.isOpen()) - self.s.port = 0 - self.failUnless(self.s.isOpen()) - self.failUnlessEqual(self.s.port, 0) - self.failUnlessEqual(self.s.portstr, serial.device(0)) - try: - self.s.port = 1 - except serial.SerialException: #port not available on system - pass #cant test on this machine... - else: - self.failUnless(self.s.isOpen()) - self.failUnlessEqual(self.s.port, 1) - self.failUnlessEqual(self.s.portstr, serial.device(1)) - - def test_BaudrateSetting(self): - self.s.port = PORT - self.s.open() - for baudrate in (300, 9600, 19200, 115200): - self.s.baudrate = baudrate - #test get method - self.failUnlessEqual(self.s.baudrate, baudrate) - #test internals - self.failUnlessEqual(self.s._baudrate, baudrate) - #test illegal values - for illegal_value in (-300, -1, 'a', None): - self.failUnlessRaises(ValueError, self.s.setBaudrate, illegal_value) - - def test_BaudrateSetting2(self): - #test illegal values, depending on machine/port some of these may be valid... - self.s.port = PORT - self.s.open() - for illegal_value in (500000,576000,921600,92160): - self.failUnlessRaises(ValueError, self.s.setBaudrate, illegal_value) - - def test_BytesizeSetting(self): - for bytesize in (5,6,7,8): - self.s.bytesize = bytesize - #test get method - self.failUnlessEqual(self.s.bytesize, bytesize) - #test internals - self.failUnlessEqual(self.s._bytesize, bytesize) - #test illegal values - for illegal_value in (0, 1, 3, 4, 9, 10, 'a', None): - self.failUnlessRaises(ValueError, self.s.setByteSize, illegal_value) - - def test_ParitySetting(self): - for parity in (serial.PARITY_NONE, serial.PARITY_EVEN, serial.PARITY_ODD): - self.s.parity = parity - #test get method - self.failUnlessEqual(self.s.parity, parity) - #test internals - self.failUnlessEqual(self.s._parity, parity) - #test illegal values - for illegal_value in (0, 57, 'a', None): - self.failUnlessRaises(ValueError, self.s.setParity, illegal_value) - - def test_StopbitsSetting(self): - for stopbits in (1, 2): - self.s.stopbits = stopbits - #test get method - self.failUnlessEqual(self.s.stopbits, stopbits) - #test internals - self.failUnlessEqual(self.s._stopbits, stopbits) - #test illegal values - for illegal_value in (0, 3, 1.5, 57, 'a', None): - self.failUnlessRaises(ValueError, self.s.setStopbits, illegal_value) - - def test_TimeoutSetting(self): - for timeout in (None, 0, 1, 3.14159, 10, 1000, 3600): - self.s.timeout = timeout - #test get method - self.failUnlessEqual(self.s.timeout, timeout) - #test internals - self.failUnlessEqual(self.s._timeout, timeout) - #test illegal values - for illegal_value in (-1, 'a'): - self.failUnlessRaises(ValueError, self.s.setTimeout, illegal_value) - - def test_XonXoffSetting(self): - for xonxoff in (True, False): - self.s.xonxoff = xonxoff - #test get method - self.failUnlessEqual(self.s.xonxoff, xonxoff) - #test internals - self.failUnlessEqual(self.s._xonxoff, xonxoff) - #no illegal values here, normal rules for the boolean value of an - #object are used thus all objects have a truth value. - - def test_RtsCtsSetting(self): - for rtscts in (True, False): - self.s.rtscts = rtscts - #test get method - self.failUnlessEqual(self.s.rtscts, rtscts) - #test internals - self.failUnlessEqual(self.s._rtscts, rtscts) - #no illegal values here, normal rules for the boolean value of an - #object are used thus all objects have a truth value. - - def test_UnconfiguredPort(self): - #an unconfigured port cannot be opened - self.failUnlessRaises(serial.SerialException, self.s.open) - - def test_PortOpenClose(self): - self.s.port = PORT - for i in range(3): - #open the port and check flag - self.failUnless(not self.s.isOpen()) - self.s.open() - self.failUnless(self.s.isOpen()) - self.s.close() - self.failUnless(not self.s.isOpen()) - -if __name__ == '__main__': - import sys - print __doc__ - print "Testing port", PORT - sys.argv.append('-v') - # When this module is executed from the command-line, it runs all its tests - unittest.main() diff --git a/pyserial/examples/wxSerialConfigDialog.py b/pyserial/examples/wxSerialConfigDialog.py deleted file mode 100644 index 5543537..0000000 --- a/pyserial/examples/wxSerialConfigDialog.py +++ /dev/null @@ -1,259 +0,0 @@ -#!/usr/bin/env python -# generated by wxGlade 0.3.1 on Thu Oct 02 23:25:44 2003 - -from wxPython.wx import * -import serial - -SHOW_BAUDRATE = 1<<0 -SHOW_FORMAT = 1<<1 -SHOW_FLOW = 1<<2 -SHOW_TIMEOUT = 1<<3 -SHOW_ALL = SHOW_BAUDRATE|SHOW_FORMAT|SHOW_FLOW|SHOW_TIMEOUT - -try: - enumerate -except NameError: - def enumerate(sequence): - return zip(range(len(sequence)), sequence) - -class SerialConfigDialog(wxDialog): - """Serial Port confiuration dialog, to be used with pyserial 2.0+ - When instantiating a class of this dialog, then the "serial" keyword - argument is mandatory. It is a reference to a serial.Serial instance. - the optional "show" keyword argument can be used to show/hide different - settings. The default is SHOW_ALL which coresponds to - SHOW_BAUDRATE|SHOW_FORMAT|SHOW_FLOW|SHOW_TIMEOUT. All constants can be - found in ths module (not the class).""" - - def __init__(self, *args, **kwds): - #grab the serial keyword and remove it from the dict - self.serial = kwds['serial'] - del kwds['serial'] - self.show = SHOW_ALL - if kwds.has_key('show'): - self.show = kwds['show'] - del kwds['show'] - # begin wxGlade: SerialConfigDialog.__init__ - # end wxGlade - kwds["style"] = wxDEFAULT_DIALOG_STYLE - wxDialog.__init__(self, *args, **kwds) - self.label_2 = wxStaticText(self, -1, "Port") - self.combo_box_port = wxComboBox(self, -1, choices=["dummy1", "dummy2", "dummy3", "dummy4", "dummy5"], style=wxCB_DROPDOWN) - if self.show & SHOW_BAUDRATE: - self.label_1 = wxStaticText(self, -1, "Baudrate") - self.choice_baudrate = wxChoice(self, -1, choices=["choice 1"]) - if self.show & SHOW_FORMAT: - self.label_3 = wxStaticText(self, -1, "Data Bits") - self.choice_databits = wxChoice(self, -1, choices=["choice 1"]) - self.label_4 = wxStaticText(self, -1, "Stop Bits") - self.choice_stopbits = wxChoice(self, -1, choices=["choice 1"]) - self.label_5 = wxStaticText(self, -1, "Parity") - self.choice_parity = wxChoice(self, -1, choices=["choice 1"]) - if self.show & SHOW_TIMEOUT: - self.checkbox_timeout = wxCheckBox(self, -1, "Use Timeout") - self.text_ctrl_timeout = wxTextCtrl(self, -1, "") - self.label_6 = wxStaticText(self, -1, "seconds") - if self.show & SHOW_FLOW: - self.checkbox_rtscts = wxCheckBox(self, -1, "RTS/CTS") - self.checkbox_xonxoff = wxCheckBox(self, -1, "Xon/Xoff") - self.button_ok = wxButton(self, -1, "OK") - self.button_cancel = wxButton(self, -1, "Cancel") - - self.__set_properties() - self.__do_layout() - #fill in ports and select current setting - index = 0 - self.combo_box_port.Clear() - for n in range(4): - portname = serial.device(n) - self.combo_box_port.Append(portname) - if self.serial.portstr == portname: - index = n - if self.serial.portstr is not None: - self.combo_box_port.SetValue(str(self.serial.portstr)) - else: - self.combo_box_port.SetSelection(index) - if self.show & SHOW_BAUDRATE: - #fill in badrates and select current setting - self.choice_baudrate.Clear() - for n, baudrate in enumerate(self.serial.BAUDRATES): - self.choice_baudrate.Append(str(baudrate)) - if self.serial.baudrate == baudrate: - index = n - self.choice_baudrate.SetSelection(index) - if self.show & SHOW_FORMAT: - #fill in databits and select current setting - self.choice_databits.Clear() - for n, bytesize in enumerate(self.serial.BYTESIZES): - self.choice_databits.Append(str(bytesize)) - if self.serial.bytesize == bytesize: - index = n - self.choice_databits.SetSelection(index) - #fill in stopbits and select current setting - self.choice_stopbits.Clear() - for n, stopbits in enumerate(self.serial.STOPBITS): - self.choice_stopbits.Append(str(stopbits)) - if self.serial.stopbits == stopbits: - index = n - self.choice_stopbits.SetSelection(index) - #fill in parities and select current setting - self.choice_parity.Clear() - for n, parity in enumerate(self.serial.PARITIES): - self.choice_parity.Append(str(serial.PARITY_NAMES[parity])) - if self.serial.parity == parity: - index = n - self.choice_parity.SetSelection(index) - if self.show & SHOW_TIMEOUT: - #set the timeout mode and value - if self.serial.timeout is None: - self.checkbox_timeout.SetValue(False) - self.text_ctrl_timeout.Enable(False) - else: - self.checkbox_timeout.SetValue(True) - self.text_ctrl_timeout.Enable(True) - self.text_ctrl_timeout.SetValue(str(self.serial.timeout)) - if self.show & SHOW_FLOW: - #set the rtscts mode - self.checkbox_rtscts.SetValue(self.serial.rtscts) - #set the rtscts mode - self.checkbox_xonxoff.SetValue(self.serial.xonxoff) - #attach the event handlers - self.__attach_events() - - def __set_properties(self): - # begin wxGlade: SerialConfigDialog.__set_properties - # end wxGlade - self.SetTitle("Serial Port Configuration") - if self.show & SHOW_TIMEOUT: - self.text_ctrl_timeout.Enable(0) - self.button_ok.SetDefault() - - def __do_layout(self): - # begin wxGlade: SerialConfigDialog.__do_layout - # end wxGlade - sizer_2 = wxBoxSizer(wxVERTICAL) - sizer_3 = wxBoxSizer(wxHORIZONTAL) - sizer_basics = wxStaticBoxSizer(wxStaticBox(self, -1, "Basics"), wxVERTICAL) - sizer_5 = wxBoxSizer(wxHORIZONTAL) - sizer_5.Add(self.label_2, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4) - sizer_5.Add(self.combo_box_port, 1, 0, 0) - sizer_basics.Add(sizer_5, 0, wxRIGHT|wxEXPAND, 0) - if self.show & SHOW_BAUDRATE: - sizer_baudrate = wxBoxSizer(wxHORIZONTAL) - sizer_baudrate.Add(self.label_1, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4) - sizer_baudrate.Add(self.choice_baudrate, 1, wxALIGN_RIGHT, 0) - sizer_basics.Add(sizer_baudrate, 0, wxEXPAND, 0) - sizer_2.Add(sizer_basics, 0, wxEXPAND, 0) - if self.show & SHOW_FORMAT: - sizer_8 = wxBoxSizer(wxHORIZONTAL) - sizer_7 = wxBoxSizer(wxHORIZONTAL) - sizer_6 = wxBoxSizer(wxHORIZONTAL) - sizer_format = wxStaticBoxSizer(wxStaticBox(self, -1, "Data Format"), wxVERTICAL) - sizer_6.Add(self.label_3, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4) - sizer_6.Add(self.choice_databits, 1, wxALIGN_RIGHT, 0) - sizer_format.Add(sizer_6, 0, wxEXPAND, 0) - sizer_7.Add(self.label_4, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4) - sizer_7.Add(self.choice_stopbits, 1, wxALIGN_RIGHT, 0) - sizer_format.Add(sizer_7, 0, wxEXPAND, 0) - sizer_8.Add(self.label_5, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4) - sizer_8.Add(self.choice_parity, 1, wxALIGN_RIGHT, 0) - sizer_format.Add(sizer_8, 0, wxEXPAND, 0) - sizer_2.Add(sizer_format, 0, wxEXPAND, 0) - if self.show & SHOW_TIMEOUT: - sizer_timeout = wxStaticBoxSizer(wxStaticBox(self, -1, "Timeout"), wxHORIZONTAL) - sizer_timeout.Add(self.checkbox_timeout, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4) - sizer_timeout.Add(self.text_ctrl_timeout, 0, 0, 0) - sizer_timeout.Add(self.label_6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4) - sizer_2.Add(sizer_timeout, 0, 0, 0) - if self.show & SHOW_FLOW: - sizer_flow = wxStaticBoxSizer(wxStaticBox(self, -1, "Flow Control"), wxHORIZONTAL) - sizer_flow.Add(self.checkbox_rtscts, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4) - sizer_flow.Add(self.checkbox_xonxoff, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4) - sizer_flow.Add((10,10), 1, wxEXPAND, 0) - sizer_2.Add(sizer_flow, 0, wxEXPAND, 0) - sizer_3.Add(self.button_ok, 0, 0, 0) - sizer_3.Add(self.button_cancel, 0, 0, 0) - sizer_2.Add(sizer_3, 0, wxALL|wxALIGN_RIGHT, 4) - self.SetAutoLayout(1) - self.SetSizer(sizer_2) - sizer_2.Fit(self) - sizer_2.SetSizeHints(self) - self.Layout() - - def __attach_events(self): - EVT_BUTTON(self, self.button_ok.GetId(), self.OnOK) - EVT_BUTTON(self, self.button_cancel.GetId(), self.OnCancel) - if self.show & SHOW_TIMEOUT: - EVT_CHECKBOX(self, self.checkbox_timeout.GetId(), self.OnTimeout) - - def OnOK(self, events): - success = True - self.serial.port = str(self.combo_box_port.GetValue()) - if self.show & SHOW_BAUDRATE: - self.serial.baudrate = self.serial.BAUDRATES[self.choice_baudrate.GetSelection()] - if self.show & SHOW_FORMAT: - self.serial.bytesize = self.serial.BYTESIZES[self.choice_databits.GetSelection()] - self.serial.stopbits = self.serial.STOPBITS[self.choice_stopbits.GetSelection()] - self.serial.parity = self.serial.PARITIES[self.choice_parity.GetSelection()] - if self.show & SHOW_FLOW: - self.serial.rtscts = self.checkbox_rtscts.GetValue() - self.serial.xonxoff = self.checkbox_xonxoff.GetValue() - if self.show & SHOW_TIMEOUT: - if self.checkbox_timeout.GetValue(): - try: - self.serial.timeout = float(self.text_ctrl_timeout.GetValue()) - except ValueError: - dlg = wxMessageDialog(self, 'Timeout must be a numeric value', - 'Value Error', wxOK | wxICON_ERROR) - dlg.ShowModal() - dlg.Destroy() - success = False - else: - self.serial.timeout = None - if success: - self.EndModal(wxID_OK) - - def OnCancel(self, events): - self.EndModal(wxID_CANCEL) - - def OnTimeout(self, events): - if self.checkbox_timeout.GetValue(): - self.text_ctrl_timeout.Enable(True) - else: - self.text_ctrl_timeout.Enable(False) - -# end of class SerialConfigDialog - - -class MyApp(wxApp): - """Test code""" - def OnInit(self): - wxInitAllImageHandlers() - - ser = serial.Serial() - print ser - #loop until cancel is pressed, old values are used as start for the next run - #show the different views, one after the other - #value are kept. - for flags in (SHOW_BAUDRATE, SHOW_FLOW, SHOW_FORMAT, SHOW_TIMEOUT, SHOW_ALL): - dialog_serial_cfg = SerialConfigDialog(None, -1, "", serial=ser, show=flags) - self.SetTopWindow(dialog_serial_cfg) - result = dialog_serial_cfg.ShowModal() - print ser - if result != wxID_OK: - break - #the user can play around with the values, CANCEL aborts the loop - while 1: - dialog_serial_cfg = SerialConfigDialog(None, -1, "", serial=ser) - self.SetTopWindow(dialog_serial_cfg) - result = dialog_serial_cfg.ShowModal() - print ser - if result != wxID_OK: - break - return 0 - -# end of class MyApp - -if __name__ == "__main__": - app = MyApp(0) - app.MainLoop() diff --git a/pyserial/examples/wxSerialConfigDialog.wxg b/pyserial/examples/wxSerialConfigDialog.wxg deleted file mode 100644 index f5e92e0..0000000 --- a/pyserial/examples/wxSerialConfigDialog.wxg +++ /dev/null @@ -1,262 +0,0 @@ -<?xml version="1.0"?> -<!-- generated by wxGlade 0.3.1 on Fri Oct 03 01:53:04 2003 --> - -<application path="D:\prog\python\pyserial_sf\pyserial\examples\wxSerialConfigDialog.py" name="app" class="MyApp" option="0" language="python" top_window="dialog_serial_cfg" encoding="ISO-8859-1" use_gettext="0" overwrite="0"> - <object class="SerialConfigDialog" name="dialog_serial_cfg" base="EditDialog"> - <style>wxDEFAULT_DIALOG_STYLE</style> - <title>Serial Port Configuration</title> - <object class="wxBoxSizer" name="sizer_2" base="EditBoxSizer"> - <orient>wxVERTICAL</orient> - <object class="sizeritem"> - <flag>wxEXPAND</flag> - <border>0</border> - <option>0</option> - <object class="wxStaticBoxSizer" name="sizer_basics" base="EditStaticBoxSizer"> - <orient>wxVERTICAL</orient> - <label>Basics</label> - <object class="sizeritem"> - <flag>wxRIGHT|wxEXPAND</flag> - <border>0</border> - <option>0</option> - <object class="wxBoxSizer" name="sizer_5" base="EditBoxSizer"> - <orient>wxHORIZONTAL</orient> - <object class="sizeritem"> - <flag>wxALL|wxALIGN_CENTER_VERTICAL</flag> - <border>4</border> - <option>1</option> - <object class="wxStaticText" name="label_2" base="EditStaticText"> - <attribute>1</attribute> - <label>Port</label> - </object> - </object> - <object class="sizeritem"> - <border>0</border> - <option>1</option> - <object class="wxComboBox" name="combo_box_port" base="EditComboBox"> - <selection>0</selection> - <choices> - <choice>dummy1</choice> - <choice>dummy2</choice> - <choice>dummy3</choice> - <choice>dummy4</choice> - <choice>dummy5</choice> - </choices> - </object> - </object> - </object> - </object> - <object class="sizeritem"> - <flag>wxEXPAND</flag> - <border>0</border> - <option>0</option> - <object class="wxBoxSizer" name="sizer_baudrate" base="EditBoxSizer"> - <orient>wxHORIZONTAL</orient> - <object class="sizeritem"> - <flag>wxALL|wxALIGN_CENTER_VERTICAL</flag> - <border>4</border> - <option>1</option> - <object class="wxStaticText" name="label_1" base="EditStaticText"> - <attribute>1</attribute> - <label>Baudrate</label> - </object> - </object> - <object class="sizeritem"> - <flag>wxALIGN_RIGHT</flag> - <border>0</border> - <option>1</option> - <object class="wxChoice" name="choice_baudrate" base="EditChoice"> - <selection>0</selection> - <choices> - <choice>choice 1</choice> - </choices> - </object> - </object> - </object> - </object> - </object> - </object> - <object class="sizeritem"> - <flag>wxEXPAND</flag> - <border>0</border> - <option>0</option> - <object class="wxStaticBoxSizer" name="sizer_format" base="EditStaticBoxSizer"> - <orient>wxVERTICAL</orient> - <label>Data Format</label> - <object class="sizeritem"> - <flag>wxEXPAND</flag> - <border>0</border> - <option>0</option> - <object class="wxBoxSizer" name="sizer_6" base="EditBoxSizer"> - <orient>wxHORIZONTAL</orient> - <object class="sizeritem"> - <flag>wxALL|wxALIGN_CENTER_VERTICAL</flag> - <border>4</border> - <option>1</option> - <object class="wxStaticText" name="label_3" base="EditStaticText"> - <attribute>1</attribute> - <label>Data Bits</label> - </object> - </object> - <object class="sizeritem"> - <flag>wxALIGN_RIGHT</flag> - <border>0</border> - <option>1</option> - <object class="wxChoice" name="choice_databits" base="EditChoice"> - <selection>0</selection> - <choices> - <choice>choice 1</choice> - </choices> - </object> - </object> - </object> - </object> - <object class="sizeritem"> - <flag>wxEXPAND</flag> - <border>0</border> - <option>0</option> - <object class="wxBoxSizer" name="sizer_7" base="EditBoxSizer"> - <orient>wxHORIZONTAL</orient> - <object class="sizeritem"> - <flag>wxALL|wxALIGN_CENTER_VERTICAL</flag> - <border>4</border> - <option>1</option> - <object class="wxStaticText" name="label_4" base="EditStaticText"> - <attribute>1</attribute> - <label>Stop Bits</label> - </object> - </object> - <object class="sizeritem"> - <flag>wxALIGN_RIGHT</flag> - <border>0</border> - <option>1</option> - <object class="wxChoice" name="choice_stopbits" base="EditChoice"> - <selection>0</selection> - <choices> - <choice>choice 1</choice> - </choices> - </object> - </object> - </object> - </object> - <object class="sizeritem"> - <flag>wxEXPAND</flag> - <border>0</border> - <option>0</option> - <object class="wxBoxSizer" name="sizer_8" base="EditBoxSizer"> - <orient>wxHORIZONTAL</orient> - <object class="sizeritem"> - <flag>wxALL|wxALIGN_CENTER_VERTICAL</flag> - <border>4</border> - <option>1</option> - <object class="wxStaticText" name="label_5" base="EditStaticText"> - <attribute>1</attribute> - <label>Parity</label> - </object> - </object> - <object class="sizeritem"> - <flag>wxALIGN_RIGHT</flag> - <border>0</border> - <option>1</option> - <object class="wxChoice" name="choice_parity" base="EditChoice"> - <selection>0</selection> - <choices> - <choice>choice 1</choice> - </choices> - </object> - </object> - </object> - </object> - </object> - </object> - <object class="sizeritem"> - <border>0</border> - <option>0</option> - <object class="wxStaticBoxSizer" name="sizer_timeout" base="EditStaticBoxSizer"> - <orient>wxHORIZONTAL</orient> - <label>Timeout</label> - <object class="sizeritem"> - <flag>wxALL|wxALIGN_CENTER_VERTICAL</flag> - <border>4</border> - <option>0</option> - <object class="wxCheckBox" name="checkbox_timeout" base="EditCheckBox"> - <label>Use Timeout</label> - </object> - </object> - <object class="sizeritem"> - <border>0</border> - <option>0</option> - <object class="wxTextCtrl" name="text_ctrl_timeout" base="EditTextCtrl"> - <disabled>1</disabled> - </object> - </object> - <object class="sizeritem"> - <flag>wxALL|wxALIGN_CENTER_VERTICAL</flag> - <border>4</border> - <option>0</option> - <object class="wxStaticText" name="label_6" base="EditStaticText"> - <attribute>1</attribute> - <label>seconds</label> - </object> - </object> - </object> - </object> - <object class="sizeritem"> - <flag>wxEXPAND</flag> - <border>0</border> - <option>0</option> - <object class="wxStaticBoxSizer" name="sizer_flow" base="EditStaticBoxSizer"> - <orient>wxHORIZONTAL</orient> - <label>Flow Control</label> - <object class="sizeritem"> - <flag>wxALL|wxALIGN_CENTER_VERTICAL</flag> - <border>4</border> - <option>0</option> - <object class="wxCheckBox" name="checkbox_rtscts" base="EditCheckBox"> - <label>RTS/CTS</label> - </object> - </object> - <object class="sizeritem"> - <flag>wxALL|wxALIGN_CENTER_VERTICAL</flag> - <border>4</border> - <option>0</option> - <object class="wxCheckBox" name="checkbox_xonxoff" base="EditCheckBox"> - <label>Xon/Xoff</label> - </object> - </object> - <object class="sizeritem"> - <flag>wxEXPAND</flag> - <border>0</border> - <option>1</option> - <object class="spacer" name="spacer" base="EditSpacer"> - <height>10</height> - <width>10</width> - </object> - </object> - </object> - </object> - <object class="sizeritem"> - <flag>wxALL|wxALIGN_RIGHT</flag> - <border>4</border> - <option>0</option> - <object class="wxBoxSizer" name="sizer_3" base="EditBoxSizer"> - <orient>wxHORIZONTAL</orient> - <object class="sizeritem"> - <border>0</border> - <option>0</option> - <object class="wxButton" name="button_ok" base="EditButton"> - <default>1</default> - <label>OK</label> - </object> - </object> - <object class="sizeritem"> - <border>0</border> - <option>0</option> - <object class="wxButton" name="button_cancel" base="EditButton"> - <label>Cancel</label> - </object> - </object> - </object> - </object> - </object> - </object> -</application> diff --git a/pyserial/examples/wxTerminal.py b/pyserial/examples/wxTerminal.py deleted file mode 100644 index e4cdcf1..0000000 --- a/pyserial/examples/wxTerminal.py +++ /dev/null @@ -1,332 +0,0 @@ -#!/usr/bin/env python -# generated by wxGlade 0.3.1 on Fri Oct 03 23:23:45 2003 - -from wxPython.wx import * -import wxSerialConfigDialog -import serial -import threading - -#---------------------------------------------------------------------- -# Create an own event type, so that GUI updates can be delegated -# this is required as on some platforms only the main thread can -# access the GUI without crashing. wxMutexGuiEnter/wxMutexGuiLeave -# could be used too, but an event is more elegant. - -SERIALRX = wxNewEventType() -# bind to serial data receive events -EVT_SERIALRX = wxPyEventBinder(SERIALRX, 0) - -class SerialRxEvent(wxPyCommandEvent): - eventType = SERIALRX - def __init__(self, windowID, data): - wxPyCommandEvent.__init__(self, self.eventType, windowID) - self.data = data - - def Clone(self): - self.__class__(self.GetId(), self.data) - -#---------------------------------------------------------------------- - -ID_CLEAR = wxNewId() -ID_SAVEAS = wxNewId() -ID_SETTINGS = wxNewId() -ID_TERM = wxNewId() -ID_EXIT = wxNewId() - -NEWLINE_CR = 0 -NEWLINE_LF = 1 -NEWLINE_CRLF = 2 - -class TerminalSetup: - """Placeholder for various terminal settings. Used to pass the - options to the TerminalSettingsDialog.""" - def __init__(self): - self.echo = False - self.unprintable = False - self.newline = NEWLINE_CRLF - -class TerminalSettingsDialog(wxDialog): - """Simple dialog with common terminal settings like echo, newline mode.""" - - def __init__(self, *args, **kwds): - self.settings = kwds['settings'] - del kwds['settings'] - # begin wxGlade: TerminalSettingsDialog.__init__ - kwds["style"] = wxDEFAULT_DIALOG_STYLE - wxDialog.__init__(self, *args, **kwds) - self.checkbox_echo = wxCheckBox(self, -1, "Local Echo") - self.checkbox_unprintable = wxCheckBox(self, -1, "Show unprintable characters") - self.radio_box_newline = wxRadioBox(self, -1, "Newline Handling", choices=["CR only", "LF only", "CR+LF"], majorDimension=0, style=wxRA_SPECIFY_ROWS) - self.button_ok = wxButton(self, -1, "OK") - self.button_cancel = wxButton(self, -1, "Cancel") - - self.__set_properties() - self.__do_layout() - # end wxGlade - self.__attach_events() - self.checkbox_echo.SetValue(self.settings.echo) - self.checkbox_unprintable.SetValue(self.settings.unprintable) - self.radio_box_newline.SetSelection(self.settings.newline) - - def __set_properties(self): - # begin wxGlade: TerminalSettingsDialog.__set_properties - self.SetTitle("Terminal Settings") - self.radio_box_newline.SetSelection(0) - self.button_ok.SetDefault() - # end wxGlade - - def __do_layout(self): - # begin wxGlade: TerminalSettingsDialog.__do_layout - sizer_2 = wxBoxSizer(wxVERTICAL) - sizer_3 = wxBoxSizer(wxHORIZONTAL) - sizer_4 = wxStaticBoxSizer(wxStaticBox(self, -1, "Input/Output"), wxVERTICAL) - sizer_4.Add(self.checkbox_echo, 0, wxALL, 4) - sizer_4.Add(self.checkbox_unprintable, 0, wxALL, 4) - sizer_4.Add(self.radio_box_newline, 0, 0, 0) - sizer_2.Add(sizer_4, 0, wxEXPAND, 0) - sizer_3.Add(self.button_ok, 0, 0, 0) - sizer_3.Add(self.button_cancel, 0, 0, 0) - sizer_2.Add(sizer_3, 0, wxALL|wxALIGN_RIGHT, 4) - self.SetAutoLayout(1) - self.SetSizer(sizer_2) - sizer_2.Fit(self) - sizer_2.SetSizeHints(self) - self.Layout() - # end wxGlade - - def __attach_events(self): - self.Bind(EVT_BUTTON, self.OnOK, id = self.button_ok.GetId()) - self.Bind(EVT_BUTTON, self.OnCancel, id = self.button_cancel.GetId()) - - def OnOK(self, events): - """Update data wil new values and close dialog.""" - self.settings.echo = self.checkbox_echo.GetValue() - self.settings.unprintable = self.checkbox_unprintable.GetValue() - self.settings.newline = self.radio_box_newline.GetSelection() - self.EndModal(wxID_OK) - - def OnCancel(self, events): - """Do not update data but close dialog.""" - self.EndModal(wxID_CANCEL) - -# end of class TerminalSettingsDialog - - -class TerminalFrame(wxFrame): - """Simple terminal program for wxPython""" - - def __init__(self, *args, **kwds): - self.serial = serial.Serial() - self.serial.timeout = 0.5 #make sure that the alive event can be checked from time to time - self.settings = TerminalSetup() #placeholder for the settings - self.thread = None - self.alive = threading.Event() - # begin wxGlade: TerminalFrame.__init__ - kwds["style"] = wxDEFAULT_FRAME_STYLE - wxFrame.__init__(self, *args, **kwds) - self.text_ctrl_output = wxTextCtrl(self, -1, "", style=wxTE_MULTILINE|wxTE_READONLY) - - # Menu Bar - self.frame_terminal_menubar = wxMenuBar() - self.SetMenuBar(self.frame_terminal_menubar) - wxglade_tmp_menu = wxMenu() - wxglade_tmp_menu.Append(ID_CLEAR, "&Clear", "", wxITEM_NORMAL) - wxglade_tmp_menu.Append(ID_SAVEAS, "&Save Text As...", "", wxITEM_NORMAL) - wxglade_tmp_menu.AppendSeparator() - wxglade_tmp_menu.Append(ID_SETTINGS, "&Port Settings...", "", wxITEM_NORMAL) - wxglade_tmp_menu.Append(ID_TERM, "&Terminal Settings...", "", wxITEM_NORMAL) - wxglade_tmp_menu.AppendSeparator() - wxglade_tmp_menu.Append(ID_EXIT, "&Exit", "", wxITEM_NORMAL) - self.frame_terminal_menubar.Append(wxglade_tmp_menu, "&File") - # Menu Bar end - - self.__set_properties() - self.__do_layout() - # end wxGlade - self.__attach_events() #register events - self.OnPortSettings(None) #call setup dialog on startup, opens port - if not self.alive.isSet(): - self.Close() - - def StartThread(self): - """Start the receiver thread""" - self.thread = threading.Thread(target=self.ComPortThread) - self.thread.setDaemon(1) - self.thread.start() - self.alive.set() - - def StopThread(self): - """Stop the receiver thread, wait util it's finished.""" - if self.thread is not None: - self.alive.clear() #clear alive event for thread - self.thread.join() #wait until thread has finished - self.thread = None - - def __set_properties(self): - # begin wxGlade: TerminalFrame.__set_properties - self.SetTitle("Serial Terminal") - self.SetSize((546, 383)) - # end wxGlade - - def __do_layout(self): - # begin wxGlade: TerminalFrame.__do_layout - sizer_1 = wxBoxSizer(wxVERTICAL) - sizer_1.Add(self.text_ctrl_output, 1, wxEXPAND, 0) - self.SetAutoLayout(1) - self.SetSizer(sizer_1) - self.Layout() - # end wxGlade - - def __attach_events(self): - #register events at the controls - self.Bind(EVT_MENU, self.OnClear, id = ID_CLEAR) - self.Bind(EVT_MENU, self.OnSaveAs, id = ID_SAVEAS) - self.Bind(EVT_MENU, self.OnExit, id = ID_EXIT) - self.Bind(EVT_MENU, self.OnPortSettings, id = ID_SETTINGS) - self.Bind(EVT_MENU, self.OnTermSettings, id = ID_TERM) - self.text_ctrl_output.Bind(EVT_CHAR, self.OnKey) - self.Bind(EVT_SERIALRX, self.OnSerialRead) - self.Bind(EVT_CLOSE, self.OnClose) - - def OnExit(self, event): - """Menu point Exit""" - self.Close() - - def OnClose(self, event): - """Called on application shutdown.""" - self.StopThread() #stop reader thread - self.serial.close() #cleanup - self.Destroy() #close windows, exit app - - def OnSaveAs(self, event): - """Save contents of output window.""" - filename = None - dlg = wxFileDialog(None, "Save Text As...", ".", "", "Text File|*.txt|All Files|*", wxSAVE) - if dlg.ShowModal() == wxID_OK: - filename = dlg.GetPath() - dlg.Destroy() - - if filename is not None: - f = file(filename, 'w') - text = self.text_ctrl_output.GetValue() - if type(text) == unicode: - text = text.encode("latin1") #hm, is that a good asumption? - f.write(text) - f.close() - - def OnClear(self, event): - """Clear contents of output window.""" - self.text_ctrl_output.Clear() - - def OnPortSettings(self, event=None): - """Show the portsettings dialog. The reader thread is stopped for the - settings change.""" - if event is not None: #will be none when called on startup - self.StopThread() - self.serial.close() - ok = False - while not ok: - dialog_serial_cfg = wxSerialConfigDialog.SerialConfigDialog(None, -1, "", - show=wxSerialConfigDialog.SHOW_BAUDRATE|wxSerialConfigDialog.SHOW_FORMAT|wxSerialConfigDialog.SHOW_FLOW, - serial=self.serial - ) - result = dialog_serial_cfg.ShowModal() - dialog_serial_cfg.Destroy() - #open port if not called on startup, open it on startup and OK too - if result == wxID_OK or event is not None: - try: - self.serial.open() - except serial.SerialException, e: - dlg = wxMessageDialog(None, str(e), "Serial Port Error", wxOK | wxICON_ERROR) - dlg.ShowModal() - dlg.Destroy() - else: - self.StartThread() - self.SetTitle("Serial Terminal on %s [%s, %s%s%s%s%s]" % ( - self.serial.portstr, - self.serial.baudrate, - self.serial.bytesize, - self.serial.parity, - self.serial.stopbits, - self.serial.rtscts and ' RTS/CTS' or '', - self.serial.xonxoff and ' Xon/Xoff' or '', - ) - ) - ok = True - else: - #on startup, dialog aborted - self.alive.clear() - ok = True - - def OnTermSettings(self, event): - """Menu point Terminal Settings. Show the settings dialog - with the current terminal settings""" - dialog = TerminalSettingsDialog(None, -1, "", settings=self.settings) - result = dialog.ShowModal() - dialog.Destroy() - - def OnKey(self, event): - """Key event handler. if the key is in the ASCII range, write it to the serial port. - Newline handling and local echo is also done here.""" - code = event.GetKeyCode() - if code < 256: #is it printable? - if code == 13: #is it a newline? (check for CR which is the RETURN key) - if self.settings.echo: #do echo if needed - self.text_ctrl_output.AppendText('\n') - if self.settings.newline == NEWLINE_CR: - self.serial.write('\r') #send CR - elif self.settings.newline == NEWLINE_LF: - self.serial.write('\n') #send LF - elif self.settings.newline == NEWLINE_CRLF: - self.serial.write('\r\n') #send CR+LF - else: - char = chr(code) - if self.settings.echo: #do echo if needed - self.text_ctrl_output.WriteText(char) - self.serial.write(char) #send the charcater - else: - print "Extra Key:", code - - def OnSerialRead(self, event): - """Handle input from the serial port.""" - text = event.data - if self.settings.unprintable: - text = ''.join([(c >= ' ') and c or '<%d>' % ord(c) for c in text]) - self.text_ctrl_output.AppendText(text) - - def ComPortThread(self): - """Thread that handles the incomming traffic. Does the basic input - transformation (newlines) and generates an SerialRxEvent""" - while self.alive.isSet(): #loop while alive event is true - text = self.serial.read(1) #read one, with timout - if text: #check if not timeout - n = self.serial.inWaiting() #look if there is more to read - if n: - text = text + self.serial.read(n) #get it - #newline transformation - if self.settings.newline == NEWLINE_CR: - text = text.replace('\r', '\n') - elif self.settings.newline == NEWLINE_LF: - pass - elif self.settings.newline == NEWLINE_CRLF: - text = text.replace('\r\n', '\n') - event = SerialRxEvent(self.GetId(), text) - self.GetEventHandler().AddPendingEvent(event) - #~ self.OnSerialRead(text) #output text in window - -# end of class TerminalFrame - - -class MyApp(wxApp): - def OnInit(self): - wxInitAllImageHandlers() - frame_terminal = TerminalFrame(None, -1, "") - self.SetTopWindow(frame_terminal) - frame_terminal.Show(1) - return 1 - -# end of class MyApp - -if __name__ == "__main__": - app = MyApp(0) - app.MainLoop() diff --git a/pyserial/examples/wxTerminal.wxg b/pyserial/examples/wxTerminal.wxg deleted file mode 100644 index 183f876..0000000 --- a/pyserial/examples/wxTerminal.wxg +++ /dev/null @@ -1,127 +0,0 @@ -<?xml version="1.0"?> -<!-- generated by wxGlade 0.3.1 on Sat Oct 04 02:41:48 2003 --> - -<application path="D:\prog\python\pyserial_sf\pyserial\examples\wxTerminal.py" name="app" class="MyApp" option="0" language="python" top_window="frame_terminal" encoding="ISO-8859-1" use_gettext="0" overwrite="0"> - <object class="TerminalFrame" name="frame_terminal" base="EditFrame"> - <style>wxDEFAULT_FRAME_STYLE</style> - <title>Serial Terminal</title> - <menubar>1</menubar> - <size>546, 383</size> - <object class="wxBoxSizer" name="sizer_1" base="EditBoxSizer"> - <orient>wxVERTICAL</orient> - <object class="sizeritem"> - <flag>wxEXPAND</flag> - <border>0</border> - <option>1</option> - <object class="wxTextCtrl" name="text_ctrl_output" base="EditTextCtrl"> - <style>wxTE_MULTILINE|wxTE_READONLY</style> - </object> - </object> - </object> - <object class="wxMenuBar" name="frame_terminal_menubar" base="EditMenuBar"> - <menus> - <menu name="" label="&File"> - <item> - <label>&Clear</label> - <id>ID_CLEAR</id> - </item> - <item> - <label>&Save Text As...</label> - <id>ID_SAVEAS</id> - </item> - <item> - <label>---</label> - <id>---</id> - <name>---</name> - </item> - <item> - <label>&Port Settings...</label> - <id>ID_SETTINGS</id> - </item> - <item> - <label>&Terminal Settings...</label> - <id>ID_TERM</id> - </item> - <item> - <label>---</label> - <name>---</name> - </item> - <item> - <label>&Exit</label> - <id>ID_EXIT</id> - </item> - </menu> - </menus> - </object> - </object> - <object class="TerminalSettingsDialog" name="dialog_terminal_Settings" base="EditDialog"> - <style>wxDEFAULT_DIALOG_STYLE</style> - <title>Terminal Settings</title> - <object class="wxBoxSizer" name="sizer_2" base="EditBoxSizer"> - <orient>wxVERTICAL</orient> - <object class="sizeritem"> - <flag>wxEXPAND</flag> - <border>0</border> - <option>0</option> - <object class="wxStaticBoxSizer" name="sizer_4" base="EditStaticBoxSizer"> - <orient>wxVERTICAL</orient> - <label>Input/Output</label> - <object class="sizeritem"> - <flag>wxALL</flag> - <border>4</border> - <option>0</option> - <object class="wxCheckBox" name="checkbox_echo" base="EditCheckBox"> - <label>Local Echo</label> - </object> - </object> - <object class="sizeritem"> - <flag>wxALL</flag> - <border>4</border> - <option>0</option> - <object class="wxCheckBox" name="checkbox_unprintable" base="EditCheckBox"> - <label>Show unprintable characters</label> - </object> - </object> - <object class="sizeritem"> - <border>0</border> - <option>0</option> - <object class="wxRadioBox" name="radio_box_newline" base="EditRadioBox"> - <style>wxRA_SPECIFY_ROWS</style> - <selection>0</selection> - <dimension>0</dimension> - <label>Newline Handling</label> - <choices> - <choice>CR only</choice> - <choice>LF only</choice> - <choice>CR+LF</choice> - </choices> - </object> - </object> - </object> - </object> - <object class="sizeritem"> - <flag>wxALL|wxALIGN_RIGHT</flag> - <border>4</border> - <option>0</option> - <object class="wxBoxSizer" name="sizer_3" base="EditBoxSizer"> - <orient>wxHORIZONTAL</orient> - <object class="sizeritem"> - <border>0</border> - <option>0</option> - <object class="wxButton" name="button_ok" base="EditButton"> - <default>1</default> - <label>OK</label> - </object> - </object> - <object class="sizeritem"> - <border>0</border> - <option>0</option> - <object class="wxButton" name="button_cancel" base="EditButton"> - <label>Cancel</label> - </object> - </object> - </object> - </object> - </object> - </object> -</application> diff --git a/pyserial/serial/.cvsignore b/pyserial/serial/.cvsignore deleted file mode 100644 index 7e99e36..0000000 --- a/pyserial/serial/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -*.pyc
\ No newline at end of file diff --git a/pyserial/serial/__init__.py b/pyserial/serial/__init__.py deleted file mode 100644 index ac916bb..0000000 --- a/pyserial/serial/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python -#portable serial port access with python -#this is a wrapper module for different platform implementations -# -# (C)2001-2002 Chris Liechti <cliechti@gmx.net> -# this is distributed under a free software license, see license.txt - -import sys, os, string -VERSION = string.split("$Revision: 1.3 $")[1] #extract CVS version - -#chose an implementation, depending on os -if os.name == 'nt': #sys.platform == 'win32': - from serialwin32 import * -elif os.name == 'posix': - from serialposix import * -elif os.name == 'java': - from serialjava import * -else: - raise Exception("Sorry: no implementation for your platform ('%s') available" % os.name) - diff --git a/pyserial/serial/serialjava.py b/pyserial/serial/serialjava.py deleted file mode 100644 index 90b0896..0000000 --- a/pyserial/serial/serialjava.py +++ /dev/null @@ -1,212 +0,0 @@ -#!jython -#Python Serial Port Extension for Win32, Linux, BSD, Jython -#module for serial IO for Jython and JavaComm -#see __init__.py -# -#(C) 2002-2003 Chris Liechti <cliechti@gmx.net> -# this is distributed under a free software license, see license.txt - -import javax.comm -from serialutil import * - -VERSION = "$Revision: 1.8 $".split()[1] #extract CVS version - - -def device(portnumber): - """Turn a port number into a device name""" - enum = javax.comm.CommPortIdentifier.getPortIdentifiers() - ports = [] - while enum.hasMoreElements(): - el = enum.nextElement() - if el.getPortType() == javax.comm.CommPortIdentifier.PORT_SERIAL: - ports.append(el) - return ports[portnumber].getName() - -class Serial(SerialBase): - """Serial port class, implemented with javax.comm 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.""" - if self._port is None: - raise SerialException("Port must be configured before it can be used.") - if type(self._port) == type(''): #strings are taken directly - portId = javax.comm.CommPortIdentifier.getPortIdentifier(self._port) - else: - portId = javax.comm.CommPortIdentifier.getPortIdentifier(device(self._port)) #numbers are transformed to a comportid obj - try: - self.sPort = portId.open("python serial module", 10) - except Exception, msg: - self.sPort = None - raise SerialException("Could not open port: %s" % msg) - self._reconfigurePort() - self._instream = self.sPort.getInputStream() - self._outstream = self.sPort.getOutputStream() - self._isOpen = True - - def _reconfigurePort(self): - """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 = javax.comm.SerialPort.DATABITS_5 - elif self._bytesize == SIXBITS: - jdatabits = javax.comm.SerialPort.DATABITS_6 - elif self._bytesize == SEVENBITS: - jdatabits = javax.comm.SerialPort.DATABITS_7 - elif self._bytesize == EIGHTBITS: - jdatabits = javax.comm.SerialPort.DATABITS_8 - else: - raise ValueError("unsupported bytesize: %r" % self._bytesize) - - if self._stopbits == STOPBITS_ONE: - jstopbits = javax.comm.SerialPort.STOPBITS_1 - elif stopbits == STOPBITS_ONE_HALVE: - self._jstopbits = javax.comm.SerialPort.STOPBITS_1_5 - elif self._stopbits == STOPBITS_TWO: - jstopbits = javax.comm.SerialPort.STOPBITS_2 - else: - raise ValueError("unsupported number of stopbits: %r" % self._stopbits) - - if self._parity == PARITY_NONE: - jparity = javax.comm.SerialPort.PARITY_NONE - elif self._parity == PARITY_EVEN: - jparity = javax.comm.SerialPort.PARITY_EVEN - elif self._parity == PARITY_ODD: - jparity = javax.comm.SerialPort.PARITY_ODD - #~ elif self._parity == PARITY_MARK: - #~ jparity = javax.comm.SerialPort.PARITY_MARK - #~ elif self._parity == PARITY_SPACE: - #~ jparity = javax.comm.SerialPort.PARITY_SPACE - else: - raise ValueError("unsupported parity type: %r" % self._parity) - - jflowin = jflowout = 0 - if self._rtscts: - jflowin |= javax.comm.SerialPort.FLOWCONTROL_RTSCTS_IN - jflowout |= javax.comm.SerialPort.FLOWCONTROL_RTSCTS_OUT - if self._xonxoff: - jflowin |= javax.comm.SerialPort.FLOWCONTROL_XONXOFF_IN - jflowout |= javax.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: - self.sPort.disableReceiveTimeout() - - def close(self): - """Close port""" - if self._isOpen: - if self.sPort: - self._instream.close() - self._outstream.close() - self.sPort.close() - self.sPort = None - self._isOpen = False - - def makeDeviceName(self, port): - return device(port) - - # - - - - - - - - - - - - - - - - - - - - - - - - - - def inWaiting(self): - """Return the number of characters currently in the input buffer.""" - if not self.sPort: raise portNotOpenError - return self._instream.available() - - def read(self, size=1): - """Read size bytes from the serial port. If a timeout is set it may - return less characters as requested. With no timeout it will block - until the requested number of bytes is read.""" - if not self.sPort: raise portNotOpenError - read = '' - if size > 0: - while len(read) < size: - x = self._instream.read() - if x == -1: - if self.timeout >= 0: - break - else: - read = read + chr(x) - return read - - def write(self, data): - """Output the given string over the serial port.""" - if not self.sPort: raise portNotOpenError - self._outstream.write(data) - - def flushInput(self): - """Clear input buffer, discarding all that is in the buffer.""" - if not self.sPort: raise portNotOpenError - self._instream.skip(self._instream.available()) - - def flushOutput(self): - """Clear output buffer, aborting the current output and - discarding all that is in the buffer.""" - if not self.sPort: raise portNotOpenError - self._outstream.flush() - - def sendBreak(self): - """Send break condition.""" - if not self.sPort: raise portNotOpenError - self.sPort.sendBreak() - - def setRTS(self,on=1): - """Set terminal status line: Request To Send""" - if not self.sPort: raise portNotOpenError - self.sPort.setRTS(on) - - def setDTR(self,on=1): - """Set terminal status line: Data Terminal Ready""" - if not self.sPort: raise portNotOpenError - self.sPort.setDTR(on) - - def getCTS(self): - """Read terminal status line: Clear To Send""" - if not self.sPort: raise portNotOpenError - self.sPort.isCTS() - - def getDSR(self): - """Read terminal status line: Data Set Ready""" - if not self.sPort: raise portNotOpenError - self.sPort.isDSR() - - def getRI(self): - """Read terminal status line: Ring Indicator""" - if not self.sPort: raise portNotOpenError - self.sPort.isRI() - - def getCD(self): - """Read terminal status line: Carrier Detect""" - if not self.sPort: raise portNotOpenError - self.sPort.isCD() - - - -if __name__ == '__main__': - s = Serial(0, - baudrate=19200, #baudrate - bytesize=EIGHTBITS, #number of databits - parity=PARITY_EVEN, #enable parity checking - stopbits=STOPBITS_ONE, #number of stopbits - timeout=3, #set a timeout value, None for waiting forever - xonxoff=0, #enable software flow control - rtscts=0, #enable RTS/CTS flow control - ) - s.setRTS(1) - s.setDTR(1) - s.flushInput() - s.flushOutput() - s.write('hello') - print repr(s.read(5)) - print s.inWaiting() - del s - - - diff --git a/pyserial/serial/serialposix.py b/pyserial/serial/serialposix.py deleted file mode 100644 index 7f96714..0000000 --- a/pyserial/serial/serialposix.py +++ /dev/null @@ -1,400 +0,0 @@ -#!/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-2003 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>: -# ftp://ftp.visi.com/users/grante/python/PosixSerial.py -# references: http://www.easysw.com/~mike/serial/serial.html - -import sys, os, fcntl, termios, struct, select, errno -from serialutil import * - -VERSION = "$Revision: 1.26 $".split()[1] #extract CVS version - -#Do check the Python version as some constants have moved. -if (sys.hexversion < 0x020100f0): - import TERMIOS -else: - TERMIOS = termios - -if (sys.hexversion < 0x020200f0): - import FCNTL -else: - FCNTL = fcntl - -#try to detect the os so that a device can be selected... -plat = sys.platform.lower() - -if plat[:5] == 'linux': #Linux (confirmed) - def device(port): - return '/dev/ttyS%d' % port - -elif plat == 'cygwin': #cywin/win32 (confirmed) - def device(port): - return '/dev/com%d' % (port + 1) - -elif plat == 'openbsd3': #BSD (confirmed) - def device(port): - return '/dev/ttyp%d' % port - -elif plat[:3] == 'bsd' or \ - plat[:7] == 'freebsd' or \ - plat[:7] == 'openbsd' or \ - plat[:6] == 'darwin': #BSD (confirmed for freebsd4: cuaa%d) - def device(port): - return '/dev/cuaa%d' % port - -elif plat[:6] == 'netbsd': #NetBSD 1.6 testing by Erk - def device(port): - return '/dev/dty%02d' % port - -elif plat[:4] == 'irix': #IRIX (not tested) - def device(port): - return '/dev/ttyf%d' % port - -elif plat[:2] == 'hp': #HP-UX (not tested) - def device(port): - return '/dev/tty%dp0' % (port+1) - -elif plat[:5] == 'sunos': #Solaris/SunOS (confirmed) - def device(port): - return '/dev/tty%c' % (ord('a')+port) - -else: - #platform detection has failed... - print """don't know how to number ttys on this system. -! Use an explicit path (eg /dev/ttyS1) or send this information to -! the author of this module: - -sys.platform = %r -os.name = %r -serialposix.py version = %s - -also add the device name of the serial port and where the -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. - 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. - - -#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 -TIOCMSET = hasattr(TERMIOS, 'TIOCMSET') and TERMIOS.TIOCMSET or 0x5418 - -#TIOCM_LE = hasattr(TERMIOS, 'TIOCM_LE') and TERMIOS.TIOCM_LE or 0x001 -TIOCM_DTR = hasattr(TERMIOS, 'TIOCM_DTR') and TERMIOS.TIOCM_DTR or 0x002 -TIOCM_RTS = hasattr(TERMIOS, 'TIOCM_RTS') and TERMIOS.TIOCM_RTS or 0x004 -#TIOCM_ST = hasattr(TERMIOS, 'TIOCM_ST') and TERMIOS.TIOCM_ST or 0x008 -#TIOCM_SR = hasattr(TERMIOS, 'TIOCM_SR') and TERMIOS.TIOCM_SR or 0x010 - -TIOCM_CTS = hasattr(TERMIOS, 'TIOCM_CTS') and TERMIOS.TIOCM_CTS or 0x020 -TIOCM_CAR = hasattr(TERMIOS, 'TIOCM_CAR') and TERMIOS.TIOCM_CAR or 0x040 -TIOCM_RNG = hasattr(TERMIOS, 'TIOCM_RNG') and TERMIOS.TIOCM_RNG or 0x080 -TIOCM_DSR = hasattr(TERMIOS, 'TIOCM_DSR') and TERMIOS.TIOCM_DSR or 0x100 -TIOCM_CD = hasattr(TERMIOS, 'TIOCM_CD') and TERMIOS.TIOCM_CD or TIOCM_CAR -TIOCM_RI = hasattr(TERMIOS, 'TIOCM_RI') and TERMIOS.TIOCM_RI or TIOCM_RNG -#TIOCM_OUT1 = hasattr(TERMIOS, 'TIOCM_OUT1') and TERMIOS.TIOCM_OUT1 or 0x2000 -#TIOCM_OUT2 = hasattr(TERMIOS, 'TIOCM_OUT2') and TERMIOS.TIOCM_OUT2 or 0x4000 -TIOCINQ = hasattr(TERMIOS, 'FIONREAD') and TERMIOS.FIONREAD or 0x541B - -TIOCM_zero_str = struct.pack('I', 0) -TIOCM_RTS_str = struct.pack('I', TIOCM_RTS) -TIOCM_DTR_str = struct.pack('I', TIOCM_DTR) - - -class Serial(SerialBase): - """Serial port class POSIX implementation. Serial port configuration is - done with termios and fcntl. Runs on Linux and many other Un*x like - systems.""" - - def open(self): - """Open port with current settings. This may throw a SerialException - if the port cannot be opened.""" - if self._port is None: - raise SerialException("Port must be configured before it can be used.") - self.fd = None - #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" % msg) - #~ fcntl.fcntl(self.fd, FCNTL.F_SETFL, 0) #set blocking - - self._reconfigurePort() - self._isOpen = True - #~ self.flushInput() - - - def _reconfigurePort(self): - """Set commuication parameters on opened port.""" - if self.fd is None: - raise SerialException("Can only operate on a valid port handle") - - vmin = vtime = 0 #timeout is done via select - try: - 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 - 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 - - #setup baudrate - try: - ispeed = ospeed = getattr(TERMIOS,'B%s' % (self._baudrate)) - except AttributeError: - raise ValueError('Invalid baud rate: %r' % self._baudrate) - #setup char len - cflag &= ~TERMIOS.CSIZE - if self._bytesize == 8: - cflag |= TERMIOS.CS8 - elif self._bytesize == 7: - cflag |= TERMIOS.CS7 - elif self._bytesize == 6: - cflag |= TERMIOS.CS6 - elif self._bytesize == 5: - cflag |= TERMIOS.CS5 - else: - raise ValueError('Invalid char len: %r' % self._bytesize) - #setup stopbits - if self._stopbits == STOPBITS_ONE: - cflag &= ~(TERMIOS.CSTOPB) - elif self._stopbits == STOPBITS_TWO: - cflag |= (TERMIOS.CSTOPB) - else: - raise ValueError('Invalid stopit specification: %r' % self._stopbits) - #setup parity - iflag &= ~(TERMIOS.INPCK|TERMIOS.ISTRIP) - if self._parity == PARITY_NONE: - cflag &= ~(TERMIOS.PARENB|TERMIOS.PARODD) - elif self._parity == PARITY_EVEN: - cflag &= ~(TERMIOS.PARODD) - cflag |= (TERMIOS.PARENB) - elif self._parity == PARITY_ODD: - cflag |= (TERMIOS.PARENB|TERMIOS.PARODD) - else: - raise ValueError('Invalid parity: %r' % self._parity) - #setup flow control - #xonxoff - if hasattr(TERMIOS, 'IXANY'): - if self._xonxoff: - iflag |= (TERMIOS.IXON|TERMIOS.IXOFF) #|TERMIOS.IXANY) - else: - iflag &= ~(TERMIOS.IXON|TERMIOS.IXOFF|TERMIOS.IXANY) - else: - if self._xonxoff: - iflag |= (TERMIOS.IXON|TERMIOS.IXOFF) - else: - iflag &= ~(TERMIOS.IXON|TERMIOS.IXOFF) - #rtscts - if hasattr(TERMIOS, 'CRTSCTS'): - if self._rtscts: - cflag |= (TERMIOS.CRTSCTS) - else: - cflag &= ~(TERMIOS.CRTSCTS) - elif hasattr(TERMIOS, 'CNEW_RTSCTS'): #try it with alternate constant name - if self._rtscts: - cflag |= (TERMIOS.CNEW_RTSCTS) - 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" - if vmin < 0 or vmin > 255: - raise ValueError('Invalid vmin: %r ' % vmin) - cc[TERMIOS.VMIN] = vmin - #vtime - if vtime < 0 or vtime > 255: - raise ValueError('Invalid vtime: %r' % vtime) - cc[TERMIOS.VTIME] = vtime - #activate settings - termios.tcsetattr(self.fd, TERMIOS.TCSANOW, [iflag, oflag, cflag, lflag, ispeed, ospeed, cc]) - - def close(self): - """Close port""" - if self._isOpen: - if self.fd is not None: - os.close(self.fd) - self.fd = None - self._isOpen = False - - def makeDeviceName(self, port): - return device(port) - - # - - - - - - - - - - - - - - - - - - - - - - - - - - def inWaiting(self): - """Return the number of characters currently in the input buffer.""" - #~ s = fcntl.ioctl(self.fd, TERMIOS.FIONREAD, TIOCM_zero_str) - s = fcntl.ioctl(self.fd, TIOCINQ, TIOCM_zero_str) - return struct.unpack('I',s)[0] - - def read(self, size=1): - """Read size bytes from the serial port. If a timeout is set it may - return less characters as requested. With no timeout it will block - until the requested number of bytes is read.""" - if self.fd is None: raise portNotOpenError - read = '' - inp = None - if size > 0: - while len(read) < size: - #print "\tread(): size",size, "have", len(read) #debug - ready,_,_ = select.select([self.fd],[],[], self._timeout) - if not ready: - break #timeout - buf = os.read(self.fd, size-len(read)) - read = read + buf - if self._timeout >= 0 and not buf: - break #early abort on timeout - return read - - def write(self, data): - """Output the given string over the serial port.""" - if self.fd is None: raise portNotOpenError - t = len(data) - d = data - while t > 0: - try: - if self._writeTimeout is not None and self._writeTimeout > 0: - _,ready,_ = select.select([],[self.fd],[], self._writeTimeout) - if not ready: - raise writeTimeoutError - n = os.write(self.fd, d) - if self._writeTimeout is not None and self._writeTimeout > 0: - _,ready,_ = select.select([],[self.fd],[], self._writeTimeout) - if not ready: - raise writeTimeoutError - d = d[n:] - t = t - n - except OSError,v: - if v.errno != errno.EAGAIN: - raise - - def flush(self): - """Flush of file like objects. In this case, wait until all data - is written.""" - self.drainOutput() - - def flushInput(self): - """Clear input buffer, discarding all that is in the buffer.""" - if self.fd is None: - raise portNotOpenError - termios.tcflush(self.fd, TERMIOS.TCIFLUSH) - - def flushOutput(self): - """Clear output buffer, aborting the current output and - discarding all that is in the buffer.""" - if self.fd is None: - raise portNotOpenError - termios.tcflush(self.fd, TERMIOS.TCOFLUSH) - - def sendBreak(self): - """Send break condition.""" - if self.fd is None: - raise portNotOpenError - termios.tcsendbreak(self.fd, 0) - - def setRTS(self,on=1): - """Set terminal status line: Request To Send""" - if self.fd is None: raise portNotOpenError - if on: - fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_RTS_str) - else: - fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_RTS_str) - - def setDTR(self,on=1): - """Set terminal status line: Data Terminal Ready""" - if self.fd is None: raise portNotOpenError - if on: - fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_DTR_str) - else: - fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_DTR_str) - - def getCTS(self): - """Read terminal status line: Clear To Send""" - if self.fd is None: raise portNotOpenError - s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str) - return struct.unpack('I',s)[0] & TIOCM_CTS != 0 - - def getDSR(self): - """Read terminal status line: Data Set Ready""" - if self.fd is None: raise portNotOpenError - s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str) - return struct.unpack('I',s)[0] & TIOCM_DSR != 0 - - def getRI(self): - """Read terminal status line: Ring Indicator""" - if self.fd is None: raise portNotOpenError - s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str) - return struct.unpack('I',s)[0] & TIOCM_RI != 0 - - def getCD(self): - """Read terminal status line: Carrier Detect""" - if self.fd is None: raise portNotOpenError - s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str) - return struct.unpack('I',s)[0] & TIOCM_CD != 0 - - # - - platform specific - - - - - - def drainOutput(self): - """internal - not portable!""" - if self.fd is None: raise portNotOpenError - termios.tcdrain(self.fd) - - def nonblocking(self): - """internal - not portable!""" - if self.fd is None: - raise portNotOpenError - fcntl.fcntl(self.fd, FCNTL.F_SETFL, FCNTL.O_NONBLOCK) - - def fileno(self): - """For easier of the serial port instance with select. - WARNING: this function is not portable to different platforms!""" - if self.fd is None: raise portNotOpenError - return self.fd - -if __name__ == '__main__': - s = Serial(0, - baudrate=19200, #baudrate - bytesize=EIGHTBITS, #number of databits - parity=PARITY_EVEN, #enable parity checking - stopbits=STOPBITS_ONE, #number of stopbits - timeout=3, #set a timeout value, None for waiting forever - xonxoff=0, #enable software flow control - rtscts=0, #enable RTS/CTS flow control - ) - s.setRTS(1) - s.setDTR(1) - s.flushInput() - s.flushOutput() - s.write('hello') - print repr(s.read(5)) - print s.inWaiting() - del s diff --git a/pyserial/serial/serialutil.py b/pyserial/serial/serialutil.py deleted file mode 100644 index 9ffae2f..0000000 --- a/pyserial/serial/serialutil.py +++ /dev/null @@ -1,345 +0,0 @@ -#! python -#Python Serial Port Extension for Win32, Linux, BSD, Jython -#see __init__.py -# -#(C) 2001-2003 Chris Liechti <cliechti@gmx.net> -# this is distributed under a free software license, see license.txt - -PARITY_NONE, PARITY_EVEN, PARITY_ODD = 'N', 'E', 'O' -STOPBITS_ONE, STOPBITS_TWO = (1, 2) -FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5,6,7,8) - -PARITY_NAMES = { - PARITY_NONE: 'None', - PARITY_EVEN: 'Even', - PARITY_ODD: 'Odd', -} - -XON = chr(17) -XOFF = chr(19) - -#Python < 2.2.3 compatibility -try: - True -except: - True = 1 - False = not True - -class SerialException(Exception): - """Base class for serial port related exceptions.""" - -portNotOpenError = SerialException('Port not open') - -class SerialTimeoutException(SerialException): - """Write timeouts give an exception""" - -writeTimeoutError = SerialTimeoutException("Write timeout") - -class FileLike(object): - """An abstract file like class. - - This class implements readline and readlines based on read and - writelines based on write. - This class is used to provide the above functions for to Serial - port objects. - - Note that when the serial port was opened with _NO_ timeout that - readline blocks until it sees a newline (or the specified size is - reached) and that readlines would never return and therefore - refuses to work (it raises an exception in this case)! - """ - - def read(self, size): raise NotImplementedError - def write(self, s): raise NotImplementedError - - def readline(self, size=None, eol='\n'): - """read a line which is terminated with end-of-line (eol) character - ('\n' by default) or until timeout""" - line = '' - while 1: - c = self.read(1) - if c: - line += c #not very efficient but lines are usually not that long - if c == eol: - break - if size is not None and len(line) >= size: - break - else: - break - return line - - def readlines(self, sizehint=None, eol='\n'): - """read a list of lines, until timeout - sizehint is ignored""" - if self.timeout is None: - raise ValueError, "Serial port MUST have enabled timeout for this function!" - lines = [] - while 1: - line = self.readline(eol=eol) - if line: - lines.append(line) - if line[-1] != eol: #was the line received with a timeout? - break - else: - break - return lines - - def xreadlines(self, sizehint=None): - """just call readlines - here for compatibility""" - return self.readlines() - - def writelines(self, sequence): - for line in sequence: - self.write(line) - - def flush(self): - """flush of file like objects""" - pass - -class SerialBase(FileLike): - """Serial port base class. Provides __init__ function and properties to - get/set port settings.""" - - #default values, may be overriden in subclasses that do not support all values - BAUDRATES = (50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600, - 19200,38400,57600,115200,230400,460800,500000,576000,921600, - 1000000,1152000,1500000,2000000,2500000,3000000,3500000,4000000) - BYTESIZES = (FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS) - PARITIES = (PARITY_NONE, PARITY_EVEN, PARITY_ODD) - STOPBITS = (STOPBITS_ONE, STOPBITS_TWO) - - def __init__(self, - port = None, #number of device, numbering starts at - #zero. if everything fails, the user - #can specify a device string, note - #that this isn't portable anymore - #port will be opened if one is specified - baudrate=9600, #baudrate - bytesize=EIGHTBITS, #number of databits - parity=PARITY_NONE, #enable parity checking - stopbits=STOPBITS_ONE, #number of stopbits - timeout=None, #set a timeout value, None to wait forever - xonxoff=0, #enable software flow control - rtscts=0, #enable RTS/CTS flow control - writeTimeout=None, #set a timeout for writes - ): - """Initialize comm port object. If a port is given, then the port will be - opened immediately. Otherwise a Serial port object in closed state - is returned.""" - - self._isOpen = False - self._port = None #correct value is assigned below trough properties - self._baudrate = None #correct value is assigned below trough properties - self._bytesize = None #correct value is assigned below trough properties - self._parity = None #correct value is assigned below trough properties - self._stopbits = None #correct value is assigned below trough properties - self._timeout = None #correct value is assigned below trough properties - self._writeTimeout = None #correct value is assigned below trough properties - self._xonxoff = None #correct value is assigned below trough properties - self._rtscts = None #correct value is assigned below trough properties - - #assign values using get/set methods using the properties feature - self.port = port - self.baudrate = baudrate - self.bytesize = bytesize - self.parity = parity - self.stopbits = stopbits - self.timeout = timeout - self.writeTimeout = writeTimeout - self.xonxoff = xonxoff - self.rtscts = rtscts - - if port is not None: - self.open() - - def isOpen(self): - """Check if the port is opened.""" - return self._isOpen - - # - - - - - - - - - - - - - - - - - - - - - - - - - - #TODO: these are not realy needed as the is the BAUDRATES etc attribute... - #maybe i remove them before the final release... - - def getSupportedBaudrates(self): - return [(str(b), b) for b in self.BAUDRATES] - - def getSupportedByteSizes(self): - return [(str(b), b) for b in self.BYTESIZES] - - def getSupportedStopbits(self): - return [(str(b), b) for b in self.STOPBITS] - - def getSupportedParities(self): - return [(PARITY_NAMES[b], b) for b in self.PARITIES] - - # - - - - - - - - - - - - - - - - - - - - - - - - - - def setPort(self, port): - """Change the port. The attribute portstr is set to a string that - contains the name of the port.""" - - was_open = self._isOpen - if was_open: self.close() - if port is not None: - if type(port) == type(''): #strings are taken directly - self.portstr = port - else: - self.portstr = self.makeDeviceName(port) - else: - self.portstr = None - self._port = port - if was_open: self.open() - - def getPort(self): - """Get the current port setting. The value that was passed on init or using - setPort() is passed back. See also the attribute portstr which contains - the name of the port as a string.""" - return self._port - - port = property(getPort, setPort, doc="Port setting") - - - def setBaudrate(self, baudrate): - """Change baudrate. It raises a ValueError if the port is open and the - baudrate is not possible. If the port is closed, then tha value is - accepted and the exception is raised when the port is opened.""" - #~ if baudrate not in self.BAUDRATES: raise ValueError("Not a valid baudrate: %r" % baudrate) - try: - self._baudrate = int(baudrate) - except TypeError: - raise ValueError("Not a valid baudrate: %r" % baudrate) - else: - if self._isOpen: self._reconfigurePort() - - def getBaudrate(self): - """Get the current baudrate setting.""" - return self._baudrate - - baudrate = property(getBaudrate, setBaudrate, doc="Baudrate setting") - - - def setByteSize(self, bytesize): - """Change byte size.""" - if bytesize not in self.BYTESIZES: raise ValueError("Not a valid byte size: %r" % bytesize) - self._bytesize = bytesize - if self._isOpen: self._reconfigurePort() - - def getByteSize(self): - """Get the current byte size setting.""" - return self._bytesize - - bytesize = property(getByteSize, setByteSize, doc="Byte size setting") - - - def setParity(self, parity): - """Change parity setting.""" - if parity not in self.PARITIES: raise ValueError("Not a valid parity: %r" % parity) - self._parity = parity - if self._isOpen: self._reconfigurePort() - - def getParity(self): - """Get the current parity setting.""" - return self._parity - - parity = property(getParity, setParity, doc="Parity setting") - - - def setStopbits(self, stopbits): - """Change stopbits size.""" - if stopbits not in self.STOPBITS: raise ValueError("Not a valid stopbit size: %r" % stopbits) - self._stopbits = stopbits - if self._isOpen: self._reconfigurePort() - - def getStopbits(self): - """Get the current stopbits setting.""" - return self._stopbits - - stopbits = property(getStopbits, setStopbits, doc="Stopbits setting") - - - def setTimeout(self, timeout): - """Change timeout setting.""" - if timeout is not None: - if timeout < 0: raise ValueError("Not a valid timeout: %r" % timeout) - try: - timeout + 1 #test if it's a number, will throw a TypeError if not... - except TypeError: - raise ValueError("Not a valid timeout: %r" % timeout) - - self._timeout = timeout - if self._isOpen: self._reconfigurePort() - - def getTimeout(self): - """Get the current timeout setting.""" - return self._timeout - - timeout = property(getTimeout, setTimeout, doc="Timeout setting for read()") - - - def setWriteTimeout(self, timeout): - """Change timeout setting.""" - if timeout is not None: - if timeout < 0: raise ValueError("Not a valid timeout: %r" % timeout) - try: - timeout + 1 #test if it's a number, will throw a TypeError if not... - except TypeError: - raise ValueError("Not a valid timeout: %r" % timeout) - - self._writeTimeout = timeout - if self._isOpen: self._reconfigurePort() - - def getWriteTimeout(self): - """Get the current timeout setting.""" - return self._writeTimeout - - writeTimeout = property(getWriteTimeout, setWriteTimeout, doc="Timeout setting for write()") - - - def setXonXoff(self, xonxoff): - """Change XonXoff setting.""" - self._xonxoff = xonxoff - if self._isOpen: self._reconfigurePort() - - def getXonXoff(self): - """Get the current XonXoff setting.""" - return self._xonxoff - - xonxoff = property(getXonXoff, setXonXoff, doc="Xon/Xoff setting") - - def setRtsCts(self, rtscts): - """Change RtsCts setting.""" - self._rtscts = rtscts - if self._isOpen: self._reconfigurePort() - - def getRtsCts(self): - """Get the current RtsCts setting.""" - return self._rtscts - - rtscts = property(getRtsCts, setRtsCts, doc="RTS/CTS setting") - - # - - - - - - - - - - - - - - - - - - - - - - - - - - def __repr__(self): - """String representation of the current port settings and its state.""" - return "%s<id=0x%x, open=%s>(port=%r, baudrate=%r, bytesize=%r, parity=%r, stopbits=%r, timeout=%r, xonxoff=%r, rtscts=%r)" % ( - self.__class__.__name__, - id(self), - self._isOpen, - self.portstr, - self.baudrate, - self.bytesize, - self.parity, - self.stopbits, - self.timeout, - self.xonxoff, - self.rtscts, - ) - -if __name__ == '__main__': - s = SerialBase() - print s.getSupportedBaudrates() - print s.getSupportedByteSizes() - print s.getSupportedParities() - print s.getSupportedStopbits() - print s diff --git a/pyserial/serial/serialwin32.py b/pyserial/serial/serialwin32.py deleted file mode 100644 index af94bd8..0000000 --- a/pyserial/serial/serialwin32.py +++ /dev/null @@ -1,312 +0,0 @@ -#! python -#Python Serial Port Extension for Win32, Linux, BSD, Jython -#serial driver for win32 -#see __init__.py -# -#(C) 2001-2003 Chris Liechti <cliechti@gmx.net> -# this is distributed under a free software license, see license.txt - -import win32file # The base COM port and file IO functions. -import win32event # We use events and the WaitFor[Single|Multiple]Objects functions. -import win32con # constants. -from serialutil import * - -VERSION = "$Revision: 1.30 $".split()[1] #extract CVS version - -#from winbase.h. these should realy be in win32con -MS_CTS_ON = 16 -MS_DSR_ON = 32 -MS_RING_ON = 64 -MS_RLSD_ON = 128 - -def device(portnum): - """Turn a port number into a device name""" - #the "//./COMx" format is required for devices >= 9 - #not all versions of windows seem to support this propperly - #so that the first few ports are used with the DOS device name - if portnum < 9: - return 'COM%d' % (portnum+1) #numbers are transformed to a string - else: - return r'\\.\COM%d' % (portnum+1) - -class Serial(SerialBase): - """Serial port implemenation for Win32. This implemenatation requires a - win32all installation.""" - - BAUDRATES = (50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600, - 19200,38400,57600,115200) - - def open(self): - """Open port with current settings. This may throw a SerialException - if the port cannot be opened.""" - if self._port is None: - raise SerialException("Port must be configured before it can be used.") - self.hComPort = None - try: - self.hComPort = win32file.CreateFile(self.portstr, - win32con.GENERIC_READ | win32con.GENERIC_WRITE, - 0, # exclusive access - None, # no security - win32con.OPEN_EXISTING, - win32con.FILE_ATTRIBUTE_NORMAL | win32con.FILE_FLAG_OVERLAPPED, - None) - except Exception, msg: - self.hComPort = None #'cause __del__ is called anyway - raise SerialException("could not open port: %s" % msg) - # Setup a 4k buffer - win32file.SetupComm(self.hComPort, 4096, 4096) - - #Save original timeout values: - self._orgTimeouts = win32file.GetCommTimeouts(self.hComPort) - - self._rtsState = win32file.RTS_CONTROL_ENABLE - self._dtrState = win32file.RTS_CONTROL_ENABLE - - self._reconfigurePort() - - # Clear buffers: - # Remove anything that was there - win32file.PurgeComm(self.hComPort, - win32file.PURGE_TXCLEAR | win32file.PURGE_TXABORT | - win32file.PURGE_RXCLEAR | win32file.PURGE_RXABORT) - - self._overlappedRead = win32file.OVERLAPPED() - self._overlappedRead.hEvent = win32event.CreateEvent(None, 1, 0, None) - self._overlappedWrite = win32file.OVERLAPPED() - #~ self._overlappedWrite.hEvent = win32event.CreateEvent(None, 1, 0, None) - self._overlappedWrite.hEvent = win32event.CreateEvent(None, 0, 0, None) - self._isOpen = True - - def _reconfigurePort(self): - """Set commuication parameters on opened port.""" - if not self.hComPort: - raise SerialException("Can only operate on a valid port handle") - - #Set Windows timeout values - #timeouts is a tuple with the following items: - #(ReadIntervalTimeout,ReadTotalTimeoutMultiplier, - # ReadTotalTimeoutConstant,WriteTotalTimeoutMultiplier, - # WriteTotalTimeoutConstant) - if self._timeout is None: - timeouts = (0, 0, 0, 0, 0) - elif self._timeout == 0: - timeouts = (win32con.MAXDWORD, 0, 0, 0, 0) - else: - timeouts = (0, 0, int(self._timeout*1000), 0, 0) - if self._writeTimeout is None: - pass - elif self._writeTimeout == 0: - timeouts = timeouts[:-2] + (0, win32con.MAXDWORD) - else: - timeouts = timeouts[:-2] + (0, int(self._writeTimeout*1000)) - win32file.SetCommTimeouts(self.hComPort, timeouts) - - win32file.SetCommMask(self.hComPort, win32file.EV_ERR) - - # Setup the connection info. - # Get state and modify it: - comDCB = win32file.GetCommState(self.hComPort) - comDCB.BaudRate = self._baudrate - - if self._bytesize == FIVEBITS: - comDCB.ByteSize = 5 - elif self._bytesize == SIXBITS: - comDCB.ByteSize = 6 - elif self._bytesize == SEVENBITS: - comDCB.ByteSize = 7 - elif self._bytesize == EIGHTBITS: - comDCB.ByteSize = 8 - else: - raise ValueError("Unsupported number of data bits: %r" % self._bytesize) - - if self._parity == PARITY_NONE: - comDCB.Parity = win32file.NOPARITY - comDCB.fParity = 0 # Dis/Enable Parity Check - elif self._parity == PARITY_EVEN: - comDCB.Parity = win32file.EVENPARITY - comDCB.fParity = 1 # Dis/Enable Parity Check - elif self._parity == PARITY_ODD: - comDCB.Parity = win32file.ODDPARITY - comDCB.fParity = 1 # Dis/Enable Parity Check - else: - raise ValueError("Unsupported parity mode: %r" % self._parity) - - if self._stopbits == STOPBITS_ONE: - comDCB.StopBits = win32file.ONESTOPBIT - elif self._stopbits == STOPBITS_TWO: - comDCB.StopBits = win32file.TWOSTOPBITS - else: - raise ValueError("Unsupported number of stop bits: %r" % self._stopbits) - - comDCB.fBinary = 1 # Enable Binary Transmission - # Char. w/ Parity-Err are replaced with 0xff (if fErrorChar is set to TRUE) - if self._rtscts: - comDCB.fRtsControl = win32file.RTS_CONTROL_HANDSHAKE - comDCB.fDtrControl = win32file.DTR_CONTROL_HANDSHAKE - else: - comDCB.fRtsControl = self._rtsState - comDCB.fDtrControl = self._dtrState - comDCB.fOutxCtsFlow = self._rtscts - comDCB.fOutxDsrFlow = self._rtscts - comDCB.fOutX = self._xonxoff - comDCB.fInX = self._xonxoff - comDCB.fNull = 0 - comDCB.fErrorChar = 0 - comDCB.fAbortOnError = 0 - comDCB.XonChar = XON - comDCB.XoffChar = XOFF - - try: - win32file.SetCommState(self.hComPort, comDCB) - except win32file.error, e: - raise ValueError("Cannot configure port, some setting was wrong. Original message: %s" % e) - - #~ def __del__(self): - #~ self.close() - - def close(self): - """Close port""" - if self._isOpen: - if self.hComPort: - #Restore original timeout values: - win32file.SetCommTimeouts(self.hComPort, self._orgTimeouts) - #Close COM-Port: - win32file.CloseHandle(self.hComPort) - self.hComPort = None - self._isOpen = False - - def makeDeviceName(self, port): - return device(port) - - # - - - - - - - - - - - - - - - - - - - - - - - - - - def inWaiting(self): - """Return the number of characters currently in the input buffer.""" - flags, comstat = win32file.ClearCommError(self.hComPort) - return comstat.cbInQue - - def read(self, size=1): - """Read size bytes from the serial port. If a timeout is set it may - return less characters as requested. With no timeout it will block - until the requested number of bytes is read.""" - if not self.hComPort: raise portNotOpenError - if size > 0: - win32event.ResetEvent(self._overlappedRead.hEvent) - flags, comstat = win32file.ClearCommError(self.hComPort) - if self.timeout == 0: - n = min(comstat.cbInQue, size) - if n > 0: - rc, buf = win32file.ReadFile(self.hComPort, win32file.AllocateReadBuffer(n), self._overlappedRead) - win32event.WaitForSingleObject(self._overlappedRead.hEvent, win32event.INFINITE) - read = str(buf) - else: - read = '' - else: - rc, buf = win32file.ReadFile(self.hComPort, win32file.AllocateReadBuffer(size), self._overlappedRead) - n = win32file.GetOverlappedResult(self.hComPort, self._overlappedRead, 1) - read = str(buf[:n]) - else: - read = '' - return read - - def write(self, s): - """Output the given string over the serial port.""" - if not self.hComPort: raise portNotOpenError - #print repr(s), - if s: - #~ win32event.ResetEvent(self._overlappedWrite.hEvent) - err, n = win32file.WriteFile(self.hComPort, s, self._overlappedWrite) - if err: #will be ERROR_IO_PENDING: - # Wait for the write to complete. - #~ win32event.WaitForSingleObject(self._overlappedWrite.hEvent, win32event.INFINITE) - n = win32file.GetOverlappedResult(self.hComPort, self._overlappedWrite, 1) - if n != len(s): - raise writeTimeoutError - - - def flushInput(self): - """Clear input buffer, discarding all that is in the buffer.""" - if not self.hComPort: raise portNotOpenError - win32file.PurgeComm(self.hComPort, win32file.PURGE_RXCLEAR | win32file.PURGE_RXABORT) - - def flushOutput(self): - """Clear output buffer, aborting the current output and - discarding all that is in the buffer.""" - if not self.hComPort: raise portNotOpenError - win32file.PurgeComm(self.hComPort, win32file.PURGE_TXCLEAR | win32file.PURGE_TXABORT) - - def sendBreak(self): - """Send break condition.""" - if not self.hComPort: raise portNotOpenError - import time - win32file.SetCommBreak(self.hComPort) - #TODO: how to set the correct duration?? - time.sleep(0.020) - win32file.ClearCommBreak(self.hComPort) - - def setRTS(self,level=1): - """Set terminal status line: Request To Send""" - if not self.hComPort: raise portNotOpenError - if level: - self._rtsState = win32file.RTS_CONTROL_ENABLE - win32file.EscapeCommFunction(self.hComPort, win32file.SETRTS) - else: - self._rtsState = win32file.RTS_CONTROL_DISABLE - win32file.EscapeCommFunction(self.hComPort, win32file.CLRRTS) - - def setDTR(self,level=1): - """Set terminal status line: Data Terminal Ready""" - if not self.hComPort: raise portNotOpenError - if level: - self._dtrState = win32file.DTR_CONTROL_ENABLE - win32file.EscapeCommFunction(self.hComPort, win32file.SETDTR) - else: - self._dtrState = win32file.DTR_CONTROL_DISABLE - win32file.EscapeCommFunction(self.hComPort, win32file.CLRDTR) - - def getCTS(self): - """Read terminal status line: Clear To Send""" - if not self.hComPort: raise portNotOpenError - return MS_CTS_ON & win32file.GetCommModemStatus(self.hComPort) != 0 - - def getDSR(self): - """Read terminal status line: Data Set Ready""" - if not self.hComPort: raise portNotOpenError - return MS_DSR_ON & win32file.GetCommModemStatus(self.hComPort) != 0 - - def getRI(self): - """Read terminal status line: Ring Indicator""" - if not self.hComPort: raise portNotOpenError - return MS_RING_ON & win32file.GetCommModemStatus(self.hComPort) != 0 - - def getCD(self): - """Read terminal status line: Carrier Detect""" - if not self.hComPort: raise portNotOpenError - return MS_RLSD_ON & win32file.GetCommModemStatus(self.hComPort) != 0 - - # - - platform specific - - - - - - def setXON(self, level=True): - """Platform specific - set flow state.""" - if not self.hComPort: raise portNotOpenError - if level: - win32file.EscapeCommFunction(self.hComPort, win32file.SETXON) - else: - win32file.EscapeCommFunction(self.hComPort, win32file.SETXOFF) - -#Nur Testfunktion!! -if __name__ == '__main__': - print __name__ - s = Serial() - print s - - s = Serial(0) - print s - - s.baudrate = 19200 - s.databits = 7 - s.close() - s.port = 3 - s.open() - print s - diff --git a/pyserial/serial/sermsdos.py b/pyserial/serial/sermsdos.py deleted file mode 100644 index a516118..0000000 --- a/pyserial/serial/sermsdos.py +++ /dev/null @@ -1,215 +0,0 @@ -# sermsdos.py -# -# History: -# -# 3rd September 2002 Dave Haynes -# 1. First defined -# -# Although this code should run under the latest versions of -# Python, on DOS-based platforms such as Windows 95 and 98, -# it has been specifically written to be compatible with -# PyDOS, available at: -# http://www.python.org/ftp/python/wpy/dos.html -# -# PyDOS is a stripped-down version of Python 1.5.2 for -# DOS machines. Therefore, in making changes to this file, -# please respect Python 1.5.2 syntax. In addition, please -# limit the width of this file to 60 characters. -# -# Note also that the modules in PyDOS contain fewer members -# than other versions, so we are restricted to using the -# following: -# -# In module os: -# ------------- -# environ, chdir, getcwd, getpid, umask, fdopen, close, -# dup, dup2, fstat, lseek, open, read, write, O_RDONLY, -# O_WRONLY, O_RDWR, O_APPEND, O_CREAT, O_EXCL, O_TRUNC, -# access, F_OK, R_OK, W_OK, X_OK, chmod, listdir, mkdir, -# remove, rename, renames, rmdir, stat, unlink, utime, -# execl, execle, execlp, execlpe, execvp, execvpe, _exit, -# system. -# -# In module os.path: -# ------------------ -# curdir, pardir, sep, altsep, pathsep, defpath, linesep. -# - -import os -import sys -import string -import serialutil - -BAUD_RATES = { - 110: "11", - 150: "15", - 300: "30", - 600: "60", - 1200: "12", - 2400: "24", - 4800: "48", - 9600: "96", - 19200: "19"} - -(PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, -PARITY_SPACE) = range(5) -(STOPBITS_ONE, STOPBITS_ONEANDAHALF, -STOPBITS_TWO) = (1, 1.5, 2) -FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5,6,7,8) -(RETURN_ERROR, RETURN_BUSY, RETURN_RETRY, RETURN_READY, -RETURN_NONE) = ('E', 'B', 'P', 'R', 'N') -portNotOpenError = ValueError('port not open') - -def device(portnum): - return 'COM%d' % (portnum+1) - -class Serial(serialutil.FileLike): - """ - port: number of device; numbering starts at - zero. if everything fails, the user can - specify a device string, note that this - isn't portable any more - baudrate: baud rate - bytesize: number of databits - parity: enable parity checking - stopbits: number of stopbits - timeout: set a timeout (None for waiting forever) - xonxoff: enable software flow control - rtscts: enable RTS/CTS flow control - retry: DOS retry mode - """ - def __init__(self, - port, - baudrate = 9600, - bytesize = EIGHTBITS, - parity = PARITY_NONE, - stopbits = STOPBITS_ONE, - timeout = None, - xonxoff = 0, - rtscts = 0, - retry = RETURN_RETRY - ): - - if type(port) == type(''): - #strings are taken directly - self.portstr = port - else: - #numbers are transformed to a string - self.portstr = device(port+1) - - self.baud = BAUD_RATES[baudrate] - self.bytesize = str(bytesize) - - if parity == PARITY_NONE: - self.parity = 'N' - elif parity == PARITY_EVEN: - self.parity = 'E' - elif parity == PARITY_ODD: - self.parity = 'O' - elif parity == PARITY_MARK: - self.parity = 'M' - elif parity == PARITY_SPACE: - self.parity = 'S' - - self.stop = str(stopbits) - self.retry = retry - self.filename = "sermsdos.tmp" - - self._config(self.portstr, self.baud, self.parity, - self.bytesize, self.stop, self.retry, self.filename) - - def __del__(self): - self.close() - - def close(self): - pass - - def _config(self, port, baud, parity, data, stop, retry, - filename): - comString = string.join(("MODE ", port, ":" - , " BAUD= ", baud, " PARITY= ", parity - , " DATA= ", data, " STOP= ", stop, " RETRY= ", - retry, " > ", filename ), '') - os.system(comString) - - def setBaudrate(self, baudrate): - self._config(self.portstr, BAUD_RATES[baudrate], - self.parity, self.bytesize, self.stop, self.retry, - self.filename) - - def inWaiting(self): - """returns the number of bytes waiting to be read""" - raise NotImplementedError - - def read(self, num = 1): - """Read num bytes from serial port""" - handle = os.open(self.portstr, - os.O_RDONLY | os.O_BINARY) - # print os.fstat(handle) - rv = os.read(handle, num) - os.close(handle) - return rv - - def write(self, s): - """Write string to serial port""" - handle = os.open(self.portstr, - os.O_WRONLY | os.O_BINARY) - rv = os.write(handle, s) - os.close(handle) - return rv - - def flushInput(self): - raise NotImplementedError - - def flushOutput(self): - raise NotImplementedError - - def sendBreak(self): - raise NotImplementedError - - def setRTS(self,level=1): - """Set terminal status line""" - raise NotImplementedError - - def setDTR(self,level=1): - """Set terminal status line""" - raise NotImplementedError - - def getCTS(self): - """Eead terminal status line""" - raise NotImplementedError - - def getDSR(self): - """Eead terminal status line""" - raise NotImplementedError - - def getRI(self): - """Eead terminal status line""" - raise NotImplementedError - - def getCD(self): - """Eead terminal status line""" - raise NotImplementedError - - def __repr__(self): - return string.join(( "<Serial>: ", self.portstr - , self.baud, self.parity, self.bytesize, self.stop, - self.retry , self.filename), ' ') - -if __name__ == '__main__': - print __name__ - s = Serial(0) - print s - - - - - - - - - - - - - diff --git a/pyserial/setup.py b/pyserial/setup.py deleted file mode 100644 index edf608e..0000000 --- a/pyserial/setup.py +++ /dev/null @@ -1,38 +0,0 @@ -# setup.py -from distutils.core import setup -import sys - -#windows installer: -# python setup.py bdist_wininst - -# patch distutils if it can't cope with the "classifiers" or -# "download_url" keywords -if sys.version < '2.2.3': - from distutils.dist import DistributionMetadata - DistributionMetadata.classifiers = None - DistributionMetadata.download_url = None - -setup( - name="pyserial", - description="Python Serial Port Extension", - version="2.1", - author="Chris Liechti", - author_email="cliechti@gmx.net", - url="http://pyserial.sourceforge.net/", - packages=['serial'], - license="Python", - long_description="Python Serial Port Extension for Win32, Linux, BSD, Jython", - classifiers = [ - 'Development Status :: 5 - Production/Stable', - 'Intended Audience :: Developers', - 'Intended Audience :: End Users/Desktop', - 'License :: OSI Approved :: Python Software Foundation License', - 'Natural Language :: English', - 'Operating System :: POSIX', - 'Operating System :: Microsoft :: Windows', - 'Programming Language :: Python', - 'Topic :: Communications', - 'Topic :: Software Development :: Libraries', - 'Topic :: Terminals :: Serial', - ], -) |