|
|
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
1.1.1.2 root 14: import optparse
1.1 root 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)
1.1.1.2 root 44: if not d:
45: break
1.1 root 46: datatime = time.time()
47:
48: datatime -= len(d) * byteadjust
49:
50: # Reset start time if no data for some time
51: if datatime - lasttime > RESTARTINTERVAL:
52: starttime = datatime
53: charcount = 0
54: isnewline = 1
55: msg = "\n\n======= %s (adjust=%d)\n" % (
56: time.asctime(time.localtime(datatime)), ADJUSTBAUD)
57: sys.stdout.write(msg)
58: logfile.write(msg)
59: lasttime = datatime
60:
61: # Translate unprintable chars; add timestamps
62: out = ""
63: for c in d:
64: if isnewline:
65: delta = datatime - starttime - (charcount * byteadjust)
66: out += "%06.3f: " % delta
67: isnewline = 0
68: oc = ord(c)
69: charcount += 1
70: datatime += byteadjust
71: if oc == 0x0d:
72: continue
73: if oc == 0x00:
74: out += "<00>\n"
75: isnewline = 1
76: continue
77: if oc == 0x0a:
78: out += "\n"
79: isnewline = 1
80: continue
81: if oc < 0x20 or oc >= 0x7f and oc != 0x09:
82: out += "<%02x>" % oc
83: continue
84: out += c
85:
86: sys.stdout.write(out)
87: sys.stdout.flush()
88: logfile.write(out)
89: logfile.flush()
90:
91: def main():
1.1.1.2 root 92: usage = "%prog [options] [<serialdevice> [<baud>]]"
93: opts = optparse.OptionParser(usage)
94: opts.add_option("-f", "--file",
95: action="store_false", dest="serial", default=True,
96: help="read from file instead of serialdevice")
97: opts.add_option("-n", "--no-adjust",
98: action="store_false", dest="adjustbaud", default=True,
99: help="don't adjust times by serial rate")
100: options, args = opts.parse_args()
1.1 root 101: serialport = 0
102: baud = 115200
1.1.1.2 root 103: if len(args) > 2:
104: opts.error("Too many arguments")
105: if len(args) > 0:
106: serialport = args[0]
107: if len(args) > 1:
108: baud = int(args[1])
109: global ADJUSTBAUD
110: ADJUSTBAUD=options.adjustbaud
111:
112: if options.serial:
113: # Read from serial port
1.1.1.3 ! root 114: try:
! 115: import serial
! 116: except ImportError:
! 117: print """
! 118: Unable to find pyserial package ( http://pyserial.sourceforge.net/ ).
! 119: On Linux machines try: yum install pyserial
! 120: Or: apt-get install python-serial
! 121: """
! 122: sys.exit(1)
1.1.1.2 root 123: ser = serial.Serial(serialport, baud, timeout=0)
124: else:
125: # Read from a file
126: ser = open(serialport, 'rb')
127: import fcntl
128: import os
129: fcntl.fcntl(ser, fcntl.F_SETFL
130: , fcntl.fcntl(ser, fcntl.F_GETFL) | os.O_NONBLOCK)
1.1 root 131:
132: logname = time.strftime("seriallog-%Y%m%d_%H%M%S.log")
133: f = open(logname, 'wb')
134: readserial(ser, f, baud)
135:
136: if __name__ == '__main__':
137: main()
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.