| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- # 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 serial.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) = (0, 1, 2, 3, 4)
- (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)
- 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__':
- s = Serial(0)
- sys.stdio.write('%s %s\n' % (__name__, s))
|