blob: 4524ca831fb7fe7a51ec2695e452bc7ca5ebe6cf [file] [log] [blame]
#!/usr/bin/env python
# Script that can read from a serial device and show timestamps.
#
# Copyright (C) 2009 Kevin O'Connor <kevin@koconnor.net>
#
# This file may be distributed under the terms of the GNU GPLv3 license.
# Usage:
# tools/readserial.py /dev/ttyUSB0 115200
import sys
import time
import select
import serial
# Reset time counter after this much idle time.
RESTARTINTERVAL = 60
# Alter timing reports based on how much time would be spent writing
# to serial.
ADJUSTBAUD = 1
def readserial(infile, logfile, baudrate):
lasttime = 0
while 1:
# Read data
try:
res = select.select([infile, sys.stdin], [], [])
except KeyboardInterrupt:
sys.stdout.write("\n")
break
if sys.stdin in res[0]:
# Got keyboard input - force reset on next serial input
sys.stdin.read(1)
lasttime = 0
if len(res[0]) == 1:
continue
curtime = time.time()
d = infile.read(4096)
# Reset start time if no data for some time
if curtime - lasttime > RESTARTINTERVAL:
starttime = curtime
charcount = 0
isnewline = 1
sys.stdout.write("\n")
logfile.write("\n")
lasttime = curtime
# Translate unprintable chars; add timestamps
out = ""
for c in d:
if isnewline:
delta = curtime - starttime
if ADJUSTBAUD:
delta -= float(charcount * 9) / baudrate
out += "%06.3f: " % delta
isnewline = 0
oc = ord(c)
charcount += 1
if oc == 0x0d:
continue
if oc == 0x00:
out += "<00>\n"
isnewline = 1
continue
if oc == 0x0a:
out += "\n"
isnewline = 1
continue
if oc < 0x20 or oc >= 0x7f and oc != 0x09:
out += "<%02x>" % oc
continue
out += c
sys.stdout.write(out)
sys.stdout.flush()
logfile.write(out)
logfile.flush()
def printUsage():
print "Usage:\n %s [<serialdevice> [<baud>]]" % (sys.argv[0],)
sys.exit(1)
def main():
serialport = 0
baud = 115200
if len(sys.argv) > 3:
printUsage()
if len(sys.argv) > 1:
serialport = sys.argv[1]
if len(sys.argv) > 2:
baud = int(sys.argv[2])
ser = serial.Serial(serialport, baud, timeout=0)
logname = time.strftime("seriallog-%Y%m%d_%H%M%S.log")
f = open(logname, 'wb')
readserial(ser, f, baud)
if __name__ == '__main__':
main()