#!/usr/bin/python # -*- coding: cp1252 -*- # Program serial_avr_01.py ˇˇˇ OK !!! # Recives data on serial port and separats packets. # Saves data on file. # 02/06/2016 import serial import time import datetime datos_a_leer = 16384 # Amount of samples to read. sampling_rate = 5000 # Sampling frequency (SPS). canal_1 = [] canal_2 = [] # ---------- def conv_str_tag(canal, tag): """ Convert every channel from int to str, separated by a coma and adds tags at the beggining and end. """ n = len(canal) s_canal = '<' + tag + '>' for i in range(n-1): s_canal = s_canal + str(canal[i]) + ',' s_canal = s_canal + str(canal[n-1]) + '' return s_canal # ---------- Add tags and save on file ----------------- def grabar(canal_1, canal_2, archivo): str_canal = '' str_canal += conv_str_tag(canal_1, 'L1') + '\n' str_canal += conv_str_tag(canal_2, 'L2') + '\n' str_aux = '' str_aux += '' + str(datos_a_leer) + '' + '\n' str_aux += '' + str(sampling_rate) + '' + '\n' #str_aux += '' + str(ganancia) + '' + '\n' # Write to file arch = open(archivo, "w") arch.write(str_aux) arch.write(str_canal) arch.close() #-------------------------------------------- serial_avr = serial.Serial('COM37', 500000, timeout=0) # On windows time.sleep(2) #Wait for initialization. print("Initializing") buffer = '' paquete = '' valores = [] serial_avr.flushInput() serial_avr.flushOutput() valores_decod = [] conta_datos_rx = 0; #Received samples counter. print("Sending INI") serial_avr.write('INI') #Start data sampling command. #serial_avr.write(chr(0x22)) #CRC die 'INI'. Not used. serial_avr.write(chr(0x7E)) #End of packet. while conta_datos_rx < datos_a_leer: if serial_avr.inWaiting(): lectura = serial_avr.read(serial_avr.inWaiting()) buffer = buffer + lectura valores = [] if len(buffer) > 10: i = buffer.find(chr(0x7E)) if i >= 0: paquete = buffer[:i] buffer = buffer[i+1:] #print("Paquete: %s" % (paquete)) valores=[ord(i) for i in paquete] paquete = '' x = 0 while x < len(valores): if valores[x] == 0x7D: valores_decod.append(valores[x+1] ^ 0x20) x = x + 1 else: valores_decod.append(valores[x]) x = x + 1 canal1 = (valores_decod[0] * 256) + valores_decod[1] canal2 = (valores_decod[2] * 256) + valores_decod[3] canal_1.append(canal1) canal_2.append(canal2) #print("Canal 1: %s Canal2: %s " % (canal1, canal2)) valores = [] valores_decod = [] conta_datos_rx += 1 ; #print("conta_datos_rx = %s" %conta_datos_rx) #time.sleep(0.001) #Sin esta línea, el programa consume 90% de recursos CPU #Cuando la velocidad del puerto serial es alta y se recibe una gran cantidad #de datos, time.sleep() impone un tiempo demasiado largo. print("Sending PAR") serial_avr.write('PAR') #Stop data sampling. serial_avr.write(chr(0x7E)) #End of packet. serial_avr.close() #Cierra el purto serial. #print("Valores canal 1: %s" %canal_1) print("Amount of samples channel 1: %s" %len(canal_1)) #print("Valores canal 2: %s" %canal_2) print("Amount of samples channel 2: %s" %len(canal_2)) archivo = "datos_" archivo += datetime.datetime.now().strftime("%d-%m-%Y__%H_%M_%S") archivo += ".txt" print("Saving to %s" %archivo) grabar(canal_1, canal_2, archivo) print("END")