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 41 import serial.serialutil 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"} 53 54 (PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, 55 PARITY_SPACE) = (0, 1, 2, 3, 4) 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 63 def device(portnum): 64 return 'COM%d' % (portnum+1) 65 66 class Serial(serialutil.FileLike): 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(''): 94 # strings are taken directly 95 self.portstr = port 96 else: 97 # numbers are transformed to a string 98 self.portstr = device(port+1) 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): 145 """Read num bytes from serial port""" 146 handle = os.open(self.portstr, 147 os.O_RDONLY | os.O_BINARY) 148 rv = os.read(handle, num) 149 os.close(handle) 150 return rv 151 152 def write(self, s): 153 """Write string to serial port""" 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 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__': 199 s = Serial(0) 200 sys.stdio.write('%s %s\n' % (__name__, s)) 201