cliechti | 95beabc | 2002-12-06 01:11:32 +0000 | [diff] [blame] | 1 | # sermsdos.py |
| 2 | # |
| 3 | # History: |
| 4 | # |
| 5 | # 3rd September 2002 Dave Haynes |
| 6 | # 1. First defined |
| 7 | # |
| 8 | # Although this code should run under the latest versions of |
| 9 | # Python, on DOS-based platforms such as Windows 95 and 98, |
| 10 | # it has been specifically written to be compatible with |
| 11 | # PyDOS, available at: |
| 12 | # http://www.python.org/ftp/python/wpy/dos.html |
| 13 | # |
| 14 | # PyDOS is a stripped-down version of Python 1.5.2 for |
| 15 | # DOS machines. Therefore, in making changes to this file, |
| 16 | # please respect Python 1.5.2 syntax. In addition, please |
| 17 | # limit the width of this file to 60 characters. |
| 18 | # |
| 19 | # Note also that the modules in PyDOS contain fewer members |
| 20 | # than other versions, so we are restricted to using the |
| 21 | # following: |
| 22 | # |
| 23 | # In module os: |
| 24 | # ------------- |
| 25 | # environ, chdir, getcwd, getpid, umask, fdopen, close, |
| 26 | # dup, dup2, fstat, lseek, open, read, write, O_RDONLY, |
| 27 | # O_WRONLY, O_RDWR, O_APPEND, O_CREAT, O_EXCL, O_TRUNC, |
| 28 | # access, F_OK, R_OK, W_OK, X_OK, chmod, listdir, mkdir, |
| 29 | # remove, rename, renames, rmdir, stat, unlink, utime, |
| 30 | # execl, execle, execlp, execlpe, execvp, execvpe, _exit, |
| 31 | # system. |
| 32 | # |
| 33 | # In module os.path: |
| 34 | # ------------------ |
| 35 | # curdir, pardir, sep, altsep, pathsep, defpath, linesep. |
| 36 | # |
| 37 | |
| 38 | import os |
| 39 | import sys |
| 40 | import string |
cliechti | 5ef3976 | 2003-08-28 22:18:14 +0000 | [diff] [blame] | 41 | import serialutil |
cliechti | 95beabc | 2002-12-06 01:11:32 +0000 | [diff] [blame] | 42 | |
| 43 | BAUD_RATES = { |
| 44 | 110: "11", |
| 45 | 150: "15", |
| 46 | 300: "30", |
| 47 | 600: "60", |
| 48 | 1200: "12", |
| 49 | 2400: "24", |
| 50 | 4800: "48", |
| 51 | 9600: "96", |
| 52 | 19200: "19"} |
cliechti | 7aaead3 | 2009-07-23 14:02:41 +0000 | [diff] [blame^] | 53 | |
cliechti | 95beabc | 2002-12-06 01:11:32 +0000 | [diff] [blame] | 54 | (PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, |
| 55 | PARITY_SPACE) = range(5) |
| 56 | (STOPBITS_ONE, STOPBITS_ONEANDAHALF, |
| 57 | STOPBITS_TWO) = (1, 1.5, 2) |
| 58 | FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5,6,7,8) |
| 59 | (RETURN_ERROR, RETURN_BUSY, RETURN_RETRY, RETURN_READY, |
| 60 | RETURN_NONE) = ('E', 'B', 'P', 'R', 'N') |
| 61 | portNotOpenError = ValueError('port not open') |
| 62 | |
cliechti | 5ef3976 | 2003-08-28 22:18:14 +0000 | [diff] [blame] | 63 | def device(portnum): |
| 64 | return 'COM%d' % (portnum+1) |
cliechti | 95beabc | 2002-12-06 01:11:32 +0000 | [diff] [blame] | 65 | |
cliechti | 5ef3976 | 2003-08-28 22:18:14 +0000 | [diff] [blame] | 66 | class Serial(serialutil.FileLike): |
cliechti | 95beabc | 2002-12-06 01:11:32 +0000 | [diff] [blame] | 67 | """ |
| 68 | port: number of device; numbering starts at |
| 69 | zero. if everything fails, the user can |
| 70 | specify a device string, note that this |
| 71 | isn't portable any more |
| 72 | baudrate: baud rate |
| 73 | bytesize: number of databits |
| 74 | parity: enable parity checking |
| 75 | stopbits: number of stopbits |
| 76 | timeout: set a timeout (None for waiting forever) |
| 77 | xonxoff: enable software flow control |
| 78 | rtscts: enable RTS/CTS flow control |
| 79 | retry: DOS retry mode |
| 80 | """ |
| 81 | def __init__(self, |
| 82 | port, |
| 83 | baudrate = 9600, |
| 84 | bytesize = EIGHTBITS, |
| 85 | parity = PARITY_NONE, |
| 86 | stopbits = STOPBITS_ONE, |
| 87 | timeout = None, |
| 88 | xonxoff = 0, |
| 89 | rtscts = 0, |
| 90 | retry = RETURN_RETRY |
| 91 | ): |
| 92 | |
| 93 | if type(port) == type(''): |
cliechti | 7aaead3 | 2009-07-23 14:02:41 +0000 | [diff] [blame^] | 94 | # strings are taken directly |
cliechti | 95beabc | 2002-12-06 01:11:32 +0000 | [diff] [blame] | 95 | self.portstr = port |
| 96 | else: |
cliechti | 7aaead3 | 2009-07-23 14:02:41 +0000 | [diff] [blame^] | 97 | # numbers are transformed to a string |
cliechti | 5ef3976 | 2003-08-28 22:18:14 +0000 | [diff] [blame] | 98 | self.portstr = device(port+1) |
cliechti | 95beabc | 2002-12-06 01:11:32 +0000 | [diff] [blame] | 99 | |
| 100 | self.baud = BAUD_RATES[baudrate] |
| 101 | self.bytesize = str(bytesize) |
| 102 | |
| 103 | if parity == PARITY_NONE: |
| 104 | self.parity = 'N' |
| 105 | elif parity == PARITY_EVEN: |
| 106 | self.parity = 'E' |
| 107 | elif parity == PARITY_ODD: |
| 108 | self.parity = 'O' |
| 109 | elif parity == PARITY_MARK: |
| 110 | self.parity = 'M' |
| 111 | elif parity == PARITY_SPACE: |
| 112 | self.parity = 'S' |
| 113 | |
| 114 | self.stop = str(stopbits) |
| 115 | self.retry = retry |
| 116 | self.filename = "sermsdos.tmp" |
| 117 | |
| 118 | self._config(self.portstr, self.baud, self.parity, |
| 119 | self.bytesize, self.stop, self.retry, self.filename) |
| 120 | |
| 121 | def __del__(self): |
| 122 | self.close() |
| 123 | |
| 124 | def close(self): |
| 125 | pass |
| 126 | |
| 127 | def _config(self, port, baud, parity, data, stop, retry, |
| 128 | filename): |
| 129 | comString = string.join(("MODE ", port, ":" |
| 130 | , " BAUD= ", baud, " PARITY= ", parity |
| 131 | , " DATA= ", data, " STOP= ", stop, " RETRY= ", |
| 132 | retry, " > ", filename ), '') |
| 133 | os.system(comString) |
| 134 | |
| 135 | def setBaudrate(self, baudrate): |
| 136 | self._config(self.portstr, BAUD_RATES[baudrate], |
| 137 | self.parity, self.bytesize, self.stop, self.retry, |
| 138 | self.filename) |
| 139 | |
| 140 | def inWaiting(self): |
| 141 | """returns the number of bytes waiting to be read""" |
| 142 | raise NotImplementedError |
| 143 | |
| 144 | def read(self, num = 1): |
cliechti | 5ef3976 | 2003-08-28 22:18:14 +0000 | [diff] [blame] | 145 | """Read num bytes from serial port""" |
cliechti | 95beabc | 2002-12-06 01:11:32 +0000 | [diff] [blame] | 146 | handle = os.open(self.portstr, |
| 147 | os.O_RDONLY | os.O_BINARY) |
cliechti | 95beabc | 2002-12-06 01:11:32 +0000 | [diff] [blame] | 148 | rv = os.read(handle, num) |
| 149 | os.close(handle) |
| 150 | return rv |
| 151 | |
| 152 | def write(self, s): |
cliechti | 5ef3976 | 2003-08-28 22:18:14 +0000 | [diff] [blame] | 153 | """Write string to serial port""" |
cliechti | 95beabc | 2002-12-06 01:11:32 +0000 | [diff] [blame] | 154 | handle = os.open(self.portstr, |
| 155 | os.O_WRONLY | os.O_BINARY) |
| 156 | rv = os.write(handle, s) |
| 157 | os.close(handle) |
| 158 | return rv |
| 159 | |
| 160 | def flushInput(self): |
| 161 | raise NotImplementedError |
| 162 | |
| 163 | def flushOutput(self): |
| 164 | raise NotImplementedError |
| 165 | |
| 166 | def sendBreak(self): |
| 167 | raise NotImplementedError |
| 168 | |
| 169 | def setRTS(self,level=1): |
| 170 | """Set terminal status line""" |
| 171 | raise NotImplementedError |
| 172 | |
| 173 | def setDTR(self,level=1): |
| 174 | """Set terminal status line""" |
| 175 | raise NotImplementedError |
| 176 | |
| 177 | def getCTS(self): |
| 178 | """Eead terminal status line""" |
| 179 | raise NotImplementedError |
| 180 | |
| 181 | def getDSR(self): |
| 182 | """Eead terminal status line""" |
| 183 | raise NotImplementedError |
| 184 | |
| 185 | def getRI(self): |
| 186 | """Eead terminal status line""" |
| 187 | raise NotImplementedError |
| 188 | |
| 189 | def getCD(self): |
| 190 | """Eead terminal status line""" |
| 191 | raise NotImplementedError |
| 192 | |
cliechti | 95beabc | 2002-12-06 01:11:32 +0000 | [diff] [blame] | 193 | def __repr__(self): |
| 194 | return string.join(( "<Serial>: ", self.portstr |
| 195 | , self.baud, self.parity, self.bytesize, self.stop, |
| 196 | self.retry , self.filename), ' ') |
| 197 | |
| 198 | if __name__ == '__main__': |
cliechti | 95beabc | 2002-12-06 01:11:32 +0000 | [diff] [blame] | 199 | s = Serial(0) |
cliechti | 7aaead3 | 2009-07-23 14:02:41 +0000 | [diff] [blame^] | 200 | sys.stdio.write('%s %s\n' % (__name__, s)) |