Search code examples
python-3.xdatalog

Only write when serial device outputs data


I am trying to make a data-logger than writes the output from a serial device that only outputs once per minute. I need it to have a time stamp on the output. The code I have so far will log the output but it keeps logging blanks with a timestamp in-between the device's output. How do I get it to only write a line with the timestamp when the device has output?

#!/usr/bin/env python

Log data from serial port

import argparse import serial import datetime import time import os timestr = time.strftime("%Y%m%d") Tstamp = time.strftime("%Y/%m/%d %H:%M ") parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument("-d", "--device", help="device to read from", default="/dev/ttyUSB0") parser.add_argument("-s", "--speed", help="speed in bps", default=9600, type=int) args = parser.parse_args() outputFilePath = os.path.join(os.path.dirname(__file__), datetime.datetime.now().strftime("%Y-%m-%d") + ".csv") with serial.Serial(args.device, args.speed) as ser, open(outputFilePath,'w') as outputFile: print("Logging started. Ctrl-C to stop.") try: while True: time.sleep(1) x = (ser.read(ser.inWaiting())) data = x.decode('UTF-8') outputFile.write(Tstamp + " " + data + '\n') outputFile.flush() except KeyboardInterrupt: print("Logging stopped")

Sorry for the poor formatting I am not sure how to make it look right on here.


Solution

  • By adding if x!= "" and indenting properly I got it to work. Now I just need ot fix it to append the file and not overwrite it.

    #!/usr/bin/env python
    # Log data from serial port
    
    
    import argparse
    import serial
    import datetime
    import time
    import os
    
    
    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument("-d", "--device", help="device to read from", default="/dev/ttyUSB0")
    parser.add_argument("-s", "--speed", help="speed in bps", default=9600, type=int)
    args = parser.parse_args()
    
    outputFilePath = os.path.join(os.path.dirname(__file__),
                     datetime.datetime.now().strftime("%Y-%m-%d") + ".csv")
    
    with serial.Serial(args.device, args.speed) as ser, open(outputFilePath,'w') as outputFile:
        print("Logging started. Ctrl-C to stop.") 
        try:
            while True:
                time.sleep(1) 
                x = (ser.read(ser.inWaiting())) 
                data = x.decode('UTF-8')
                if data !="":
                    outputFile.write(time.strftime("%Y/%m/%d %H:%M ") + " " + data  )
                    outputFile.flush()
    
        except KeyboardInterrupt:
            print("Logging stopped")