import serial # Not a standard Python library. This will need to be installed # using 'pip install PySerial' import csv from datetime import datetime as dt from collections import deque # Used for circular array #portname = input('Enter COM Port name: ') #baud = input('Baud Rate: ') portname = 'COM3' # Change to suit port allocation/ Linux/Windows baud = 9600 buffer = deque([],10) # Circular array, empty, size: 10 timebuffer = deque([],10) # Another... # Set up CSV file with name as current YYYY-MM-DD-HH-MM.csv filename = str(dt.now().strftime('%Y-%m-%d-%H%M') + '.csv') #filename = 'test.csv' myCSV = open(filename, 'a', newline = '') # Open my file object for appending ('a') myWriter = csv.writer(myCSV, dialect = 'excel') # Attempt to open serial port try: ser = serial.Serial(portname, baud, timeout = 1) if ser.isOpen(): # Courtesy message, print date & time, serial port name print((ser.port) + ' is open...') print('START data collection. Press [Ctrl]+[C] to abort.') # Write Date & time to CSV myWriter.writerow([dt.now().isoformat(' '),'START data collection']) # Catch exceptions: wrong name, baud, serial errors etc except NameError: print('Fail.... NameError') except ValueError: print('ValueError: Param(s) out of range.') except serial.SerialException: print('Serial Exception at ' + dt.now().isoformat(' ')) try: ser.reset_input_buffer() for n in range(10): # Loop x10 readIN = ser.read(1) # Read IN 1 byte if len(readIN) != 0: # If data read from Rx buffer buffer.append(ord(readIN)) # Add to deque circular array #print(ord(readIN)) timebuffer.append(dt.now().isoformat(' ')) # for n in range(10): # print(timebuffer[n],buffer[n]) while ser.readable(): ser.reset_input_buffer() # Clear Rx buffer data = ser.read(1) # Read 1 byte buffer.append(ord(ser.read(1))) timebuffer.append(dt.now().isoformat(' ')) if len(data)>0: #print(ord(data)) # For debugging only #print(~ord(data) & 255) # Bitwise inversion of 'data' buffer.append(ord(data)) timebuffer.append(dt.now().isoformat(' ')) # If current result is +- 1 from last result if (buffer[9] > buffer[8] + 1) or (buffer[9] < (buffer[8]-1)): print(dt.now().isoformat(' '), buffer[9]) # Save last 10 results & timestamps to file for n in range(10): print(timebuffer[n], buffer[n]) myWriter.writerow([dt.now().isoformat(' '), buffer[n]]) # Catch serial port errors except serial.SerialException: pass # Wait for + except (KeyboardInterrupt, SystemExit): pass # Close file myWriter.writerow([dt.now().isoformat(' '),'END data collection']) myCSV.close() # Close serial port try: ser.close() ser.__del__() except NameError: print('No open port to close') #exit()