# HG changeset patch # User Paul Boddie # Date 1421789059 -3600 # Node ID 72f6d830b176c4368042c97e665421b1df8d9941 # Parent df3b4c8c3fe5d3c5b10e50db6108c51f2fbc559b Introduced convenience functions and added some failure handling. diff -r df3b4c8c3fe5 -r 72f6d830b176 upload.py --- a/upload.py Tue Jan 20 22:23:38 2015 +0100 +++ b/upload.py Tue Jan 20 22:24:19 2015 +0100 @@ -1,12 +1,41 @@ #!/usr/bin/env python from serial import Serial +from time import sleep import sys +port = "/dev/ttyUSB0" +rate = 115200 + +def openPort(): + global s + s = Serial(port, rate) + s.setTimeout(5) + s.readline() + +def closePort(): + global s + s.close() + s = None + +def writeToPort(data): + s.write(data) + s.flush() + print >>sys.stderr, data.rstrip() + +def readFromPort(): + resp = s.readline().rstrip("\r\n") + if resp == "?": + resp = s.readline().rstrip("\r\n") + return resp + def console(): try: while 1: - s.write(raw_input("> ") + "\n") + cmd = raw_input("> ") + if cmd: + s.write(cmd + "\n") + s.flush() print s.readline().rstrip("\r\n") except EOFError: print "Session closed." @@ -20,8 +49,8 @@ print >>sys.stderr, "Erasing sector", sector, "..." - s.write("S%x\n" % sector) - resp = s.readline().rstrip("\r\n") + writeToPort("S%x\n" % sector) + resp = readFromPort() if resp != "S": print >>sys.stderr, "Sector %d erase failed: %s" % (sector, resp) return False @@ -32,28 +61,32 @@ while i < 0x4000: value = ord(data[i]) addr = (sector << 14) | i - s.write("P%04x%02x\n" % (addr, value)) - print >>sys.stderr, "P%04x%02x" % (addr, value) - resp = s.readline().rstrip("\r\n") - if resp != "P": - print >>sys.stderr, "Program of location %04x failed: %s" % (addr, resp) - return False - #s.write("R%04x\n" % addr) - #print >>sys.stderr, "R%04x" % addr - #readvalue = s.readline().rstrip("\r\n") - #if readvalue != ("%X" % value): - # print >>sys.stderr, "Program of location %04x failed: %s read for %s written." % (addr, readvalue, "%X" % value) - # return False + + while 1: + writeToPort("P%04x%02x\n" % (addr, value)) + resp = readFromPort() + if resp != "P": + print >>sys.stderr, "Program of location %04x failed: %s" % (addr, resp) + closePort() + sleep(5) + openPort() + writeToPort("R%04x\n" % addr) + resp = readFromPort() + if resp == ("%X" % value): + break + print >>sys.stderr, "Read from location %04x failed: %s" % (addr, resp) + closePort() + sleep(5) + openPort() + else: + break + i += 1 return True if __name__ == "__main__": - port = "/dev/ttyUSB0" - rate = 115200 - - s = Serial(port, rate) - s.readline() + openPort() if "-i" in sys.argv: console()