Python: Puertos seriales y archivos binarios
Autor: Bruno Binner Quiñones
Competencia: Trabajo en equipo
Asignatura: Programación II
Palabras Clave: Python, archivos binarios, puerto serial, ctypes
Descripción de la actividad
La actividad consistió en formar grupos de 3 integrantes y desarrollar 2 scripts.
Un Script en Python que envía por el puerto serial 10.000 datos estructurados de la siguiente forma: {randint[1,100], randint[1,1.000], randint[1,10.000], random()}
Los datos se envían como String y van separados con coma y con salto de línea. Un ejemplo válido de una secuencia de datos sería así: 23,450,6.527,0.19096663981190465,\n. Los datos se envían cada 0.1 segundo.
Por el lado del Script en Python que recibe los datos, estos se deben convertir al tipo de dato original y ser almacenados en el archivo binario “ datos.bin”. Una vez que se han recibido todos los datos, estos se deben imprimir por pantalla y calcular el promedio de los datos de cada columna. Estas operaciones se hacen sobre el archivo binario.
Para simular la conexión serial, se debe utilizar el programa Virtual Serial Port Emulator y configurar un Connector , con emulación de baudios a 9.600-8N1. Aquí un esquema que clarifica lo que se debía hacer.
Siendo TX el script que envía y RX el que recibe.
Desarrollo
Lo primero que se hizo fue dividir las actividades en el código por categorías. De lo que resultaron 3.
-La primera categoría era la comunicación por serial, que se encargaba de que los 2 scripts se comunicaran por puerto serial y uno enviará datos al otro para que este último los almacenará y desglosa.
-La segunda categoría se encargaba de todo lo que es la escritura y lectura de archivos binarios.
-Y la tercera y última categoría es la encargada de tomar esos datos obtenidos del archivo binario, y hacer operaciones matemáticas sobre ellos, o sea sumar cada columna y sacar el promedio para luego imprimirlo por pantalla.
Ya divididas las actividades se le asignó a cada integrante una de acuerdo a sus habilidades. Para después juntar cada parte del código y hacerlo funcionar.
Por su puesto se mantuvo una constante comunicación entre los integrantes para que el código que cada uno estaba haciendo tuviera la misma lógica.
El resultado fue el siguiente codigo:
conx1.py
import serial as se
import random as ra
import time
s=se.Serial(0)
s.baudrate=9600
for i in range(10000):
env= str(ra.randint(1,100))+','+str(ra.randint(1,1000))+','+ str(ra.randint(1,10000)) + ',' + str(ra.random()) + ',\n'
print env
time.sleep(0.1) # Para enviar datos cada 0.1 seg
s.write(env)
s.close()
conx2.py
import serial as se
import ctypes as Ct
s=se.Serial(0)
s.baudrate=9600
class structura(Ct.Structure):
_fields_= [('num1',Ct.c_int),('num2',Ct.c_int),('num3',Ct.c_int),('num4',Ct.c_float)]
def Put( xReg ):
f.write(xReg)
return
prom_a=0.0
prom_b=0.0
prom_c=0.0
prom_f=0.0
N=10000
men =[]
datos = []
aL=[]
for i in range(N):
men.append(s.readline()[:-2])
for i in range(len(men)):
datos.append(men[i].split(','))
f = open('datos.bin','wb')
guardar = structura()
for i in range(N):
guardar.num1 = int(datos[i][0])
guardar.num2 = int(datos[i][1])
guardar.num3 = int(datos[i][2])
guardar.num4 = float(datos[i][3])
Put(guardar)
f.close()
f = open('datos.bin','rb')
for i in range(N):
f.readinto(guardar)
aL.append([guardar.num1,guardar.num2,guardar.num3,guardar.num4])
print aL[i]
prom_a+=aL[i][0]
prom_b+=aL[i][1]
prom_c+=aL[i][2]
prom_f+=aL[i][3]
prom_a=prom_a/len(aL)
prom_b=prom_b/len(aL)
prom_c=prom_c/len(aL)
prom_f=prom_f/len(aL)
print '.........................................................'
print '= Promedios ='
print 'Primera columna:',prom_a
print 'Segunda columna:',prom_b
print 'Tercera columna:',prom_c
print 'Cuarta columna:',prom_f
f.close()
s.close()
Conclusión
En el trabajo en equipo es importante mantener una constante comunicación y entendimiento con los demás integrantes. Así como lo es la organización y conocimiento de los fuertes de cada uno. Como queda demostrado en la actividad realizada, si se cumple lo arriba mencionado un trabajo se puede realizar de forma rápida y concisa.

No hay comentarios:
Publicar un comentario