rendered paste bodyimport fcntl, struct, sys, termios, ttyclass Modem(object): def __init__(self, speed=115200): self.speed = None self.openModem() self.setSpeed(speed) def openModem(self): self.tty = file('/dev/tty.baseband', 'r+b') def initModem(self): self.write('at\r') if self.read() == 'at': self.read() self.write('atv0\r') self.read() self.read() self.write('atE0\r') self.read() def setSpeed(self, speed): if self.speed != None: self.write('at+ipr=%i\r' % speed) self.tty.close() self.openModem() tty.setraw(self.tty.fileno(), termios.TCSANOW) attr = termios.tcgetattr(self.tty.fileno()) attr[0] = (attr[0] & 0xFFFFF0CDL) | 5 attr[1] = attr[1] & 0xFFFFFFFEL attr[2] = (attr[2] & 0xFFFC6CFFL) | 0x3CB00 attr[3] = attr[3] & 0xFFFFFA77L attr[2] = (attr[3] & ~termios.CSIZE) | termios.CS8 attr[2] &= ~termios.PARENB attr[3] |= termios.ICANON attr[3] &= ~termios.ECHO attr[4] = speed attr[5] = speed attr[6][termios.VEOL] = '\r' termios.tcsetattr(self.tty.fileno(), termios.TCSANOW, attr) self.handshake() self.initModem() self.speed = speed def handshake(self): from termios import TIOCM_DTR, TIOCM_RTS, TIOCM_CTS, TIOCM_DSR handshake = TIOCM_DTR | TIOCM_RTS | TIOCM_CTS | TIOCM_DSR handshake = struct.pack('I', handshake) fcntl.ioctl(self.tty.fileno(), termios.TIOCMSET, handshake) def write(self, data): print 'write:', data.rstrip('\r') self.tty.write(data) def read(self): buf = self.tty.read() if buf[0] == '\n': return self.read() buf = buf.rstrip('\r') print 'read:', data return bufif __name__ == '__main__': modem = Modem() if len(sys.argv) > 1: modem.setSpeed(int(sys.argv[1]))