|
|
1.1 ! root 1: #!/usr/bin/env python ! 2: # Script that can read from a serial device and show timestamps. ! 3: # ! 4: # Copyright (C) 2009 Kevin O'Connor <[email protected]> ! 5: # ! 6: # This file may be distributed under the terms of the GNU GPLv3 license. ! 7: ! 8: # Usage: ! 9: # tools/readserial.py /dev/ttyUSB0 115200 ! 10: ! 11: import sys ! 12: import time ! 13: import select ! 14: import serial ! 15: ! 16: # Reset time counter after this much idle time. ! 17: RESTARTINTERVAL = 60 ! 18: # Alter timing reports based on how much time would be spent writing ! 19: # to serial. ! 20: ADJUSTBAUD = 1 ! 21: # Number of bits in a transmitted byte - 8N1 is 1 start bit + 8 data ! 22: # bits + 1 stop bit. ! 23: BITSPERBYTE = 10 ! 24: ! 25: def readserial(infile, logfile, baudrate): ! 26: lasttime = 0 ! 27: byteadjust = 0.0 ! 28: if ADJUSTBAUD: ! 29: byteadjust = float(BITSPERBYTE) / baudrate ! 30: while 1: ! 31: # Read data ! 32: try: ! 33: res = select.select([infile, sys.stdin], [], []) ! 34: except KeyboardInterrupt: ! 35: sys.stdout.write("\n") ! 36: break ! 37: if sys.stdin in res[0]: ! 38: # Got keyboard input - force reset on next serial input ! 39: sys.stdin.read(1) ! 40: lasttime = 0 ! 41: if len(res[0]) == 1: ! 42: continue ! 43: d = infile.read(4096) ! 44: datatime = time.time() ! 45: ! 46: datatime -= len(d) * byteadjust ! 47: ! 48: # Reset start time if no data for some time ! 49: if datatime - lasttime > RESTARTINTERVAL: ! 50: starttime = datatime ! 51: charcount = 0 ! 52: isnewline = 1 ! 53: msg = "\n\n======= %s (adjust=%d)\n" % ( ! 54: time.asctime(time.localtime(datatime)), ADJUSTBAUD) ! 55: sys.stdout.write(msg) ! 56: logfile.write(msg) ! 57: lasttime = datatime ! 58: ! 59: # Translate unprintable chars; add timestamps ! 60: out = "" ! 61: for c in d: ! 62: if isnewline: ! 63: delta = datatime - starttime - (charcount * byteadjust) ! 64: out += "%06.3f: " % delta ! 65: isnewline = 0 ! 66: oc = ord(c) ! 67: charcount += 1 ! 68: datatime += byteadjust ! 69: if oc == 0x0d: ! 70: continue ! 71: if oc == 0x00: ! 72: out += "<00>\n" ! 73: isnewline = 1 ! 74: continue ! 75: if oc == 0x0a: ! 76: out += "\n" ! 77: isnewline = 1 ! 78: continue ! 79: if oc < 0x20 or oc >= 0x7f and oc != 0x09: ! 80: out += "<%02x>" % oc ! 81: continue ! 82: out += c ! 83: ! 84: sys.stdout.write(out) ! 85: sys.stdout.flush() ! 86: logfile.write(out) ! 87: logfile.flush() ! 88: ! 89: def printUsage(): ! 90: print "Usage:\n %s [<serialdevice> [<baud>]]" % (sys.argv[0],) ! 91: sys.exit(1) ! 92: ! 93: def main(): ! 94: serialport = 0 ! 95: baud = 115200 ! 96: if len(sys.argv) > 3: ! 97: printUsage() ! 98: if len(sys.argv) > 1: ! 99: serialport = sys.argv[1] ! 100: if len(sys.argv) > 2: ! 101: baud = int(sys.argv[2]) ! 102: ! 103: ser = serial.Serial(serialport, baud, timeout=0) ! 104: ! 105: logname = time.strftime("seriallog-%Y%m%d_%H%M%S.log") ! 106: f = open(logname, 'wb') ! 107: readserial(ser, f, baud) ! 108: ! 109: if __name__ == '__main__': ! 110: main()
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.