# 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))