Académique Documents
Professionnel Documents
Culture Documents
Carrera: Telecomunicaciones
Integrantes:
Ariel Aulestia Hermosa
Joao Cruz Veliz
Eduardo Espinosa Santafe
2. Marco Teórico
2.1. Python
2.2. Spyder
Es un entorno de desarrollo integrado (IDE) multiplataforma de código
abierto para programación científica en el lenguaje Python. Spyder se
integra con una serie de paquetes prominentes en la pila científica de
Python, que incluyen NumPy, SciPy, Matplotlib, pandas, IPython, SymPy y
Cython, así como otros softwares de código abierto.
2.3. NumPy
Es una biblioteca para el lenguaje de programación Python, que agrega
soporte para matrices grandes y multidimensionales, junto con una gran
colección de funciones matemáticas de alto nivel para operar en estas
matrices. El uso de NumPy en Python proporciona una funcionalidad
comparable a MATLAB ya que ambos se interpretan, y ambos le permiten
al usuario escribir programas rápidos siempre que la mayoría de las
operaciones funcionen en matrices en lugar de escalar . En comparación,
MATLAB cuenta con una gran cantidad de cajas de herramientas
adicionales, especialmente Simulink, mientras que NumPy está
intrínsecamente integrado con Python, un lenguaje de programación más
moderno y completo.
2.4. PySerial
Es una biblioteca que brinda soporte para conexiones en serie ("RS-
232") en una variedad de dispositivos diferentes: puertos en serie de
estilo antiguo, dongles Bluetooth, puertos de infrarrojos, etc. También
admite puertos serie remotos a través de RFC 2217 (desde V2.5).
2.5. RS-232
3. Diseño de Software
3.1. Programa Emisor | Transmission
El programa Transmission se encarga de solicitar al usuario que ingrese las
dimensiones y elementos de una matriz, todo esto por teclado, para que
posteriormente sean enviados mediante una conexión serial a otro
computador que recibirá estos datos.
import numpy as np
import serial as s
Importamos las librerías que vamos a utilizar a lo largo del programa, serial para
realizar la comunicación con el puerto, y numPy, una librería especializada en el
álgebra lineal en Python, y le colocamos una variable para poder llamarla de esa
forma, en este caso ‘np’. Y serial con una variable asignada ‘s’
transmission=s.Serial('COMX', 9600)
Establece el nombre del objeto que servirá de conexión con el puente creado
entre el COMX Y el COMY. En este caso, al tratarse del emisor, conecta al COMX, y
se coloca una velocidad de transmisión en 9600 (baudios)
print ('Ingrese la dimensión de la matriz 1')
try:
f1=int(input('Número de filas de la matriz 1:'))
if f1>9 :
print("El valor máximo de filas es: 9")
f1=9
except:
print("Valor por defecto de filas: 2")
f1=2
try:
c1=int(input('Número de columnas de la matriz 1:'))
if c1>9 :
print("El valor máximo de columnas es: 9")
c1=9
except:
print("Valor por defecto de columnas: 2")
c1=2
m=np.zeros((f1,c1))
Creamos una matriz de f1*c1 que sólo contiene ceros.
print('introduce los elementos de la matriz 1')
for f in range(0,f1):
for c in range(0,c1):
try: m[f,c]=input("elemento a["+str(f+1)+str(c+1)+"] = ")
except:
print("El valor será tomado como cero")
m[f,c]=0
Los elementos de la matriz serán ingresados por teclado uno por uno en orden,
de manera que un mensaje informará que dato se está ingresando en ese
momento, en el caso de que se ingrese un carácter que no pueda ser
transformado a entero, el valor ingresado en la matriz será cero.
transmission=s.Serial('COMX', 9600)
transmission.write(str(f1).encode())
transmission.write(str(c1).encode())
transmission.write(str(len(str(m))).encode())
transmission.write(str(m).encode())
for i in range(f1):
for j in range(c1):
long=str(m[i,j])
transmission.write(str(len(long)).encode())
while t>4 :
print("Lo sentimos, por favor ingrese uno de los valores solicitados")
try:
t=int(input())
if s=="" :
if t>4 or t==3:
print("No se puede realizar la operación")
t=5
if m=="" :
if t>3 :
print("No se puede realizar la operación")
t=5
except: t=5
transmission.write(str(t).encode())
En este proceso hacemos referencia a los valores que estarán permitidos tomar
para la variable t, la cual será la encargada de elegir el proceso a llevar a cabo. Si s
no tiene almacenado el mensaje anterior, t no podrá tomar el valor de 3; si m no
tiene almacenado un mensaje, t no podrá tomar el valor de 4. Indistintamente de
los valores de m y n, t no puede tomar valores mayores o iguales a 5, si ocurre
una violación a alguna de las condiciones antes dichas, se solicitará el ingreso
nuevamente de la variable mediante el bucle while, este bucle se repetirá
infinitamente hasta que se ingrese un número que sea válido.
Por último, cerramos el objeto usado como puerto con la sintaxis:
transmission.close()
reception=s.Serial('COMY', 9600)
lista=[ ]
ista2=[ ]
Creamos otro objeto para conectar con el puerto receptor, en este caso COMY, y
creamos dos listas vacías donde se almacenarán los datos que se enviarán.
m=int(reception.read())
n=int(reception.read())
if m*n<30:
x=int(reception.read(2))
else:
x=int(reception.read(3))
Leemos los primeros datos ingresados, que vienen a ser fila 1 y columna 1, en m y
n respectivamente, si el producto de m y n es menor que 30, se leerán dos cifras
pares el siguiente dato ingresado, en caso de que el producto sobrepase a 30, se
leerán 3 dígitos para el siguiente dato a leer. Esto debido a que el siguiente dato a
leer es el número de caracteres que posee la matriz, esto incluye corchetes,
espacios y saltos de línea, lo que hace un total muy considerable, ejemplo, si se
ingresa una matriz cuadrada de 5, el número de datos no superará los 90 (dos
cifras), pero si es una matriz cuadrada de 6 por 5 en adelante el número de datos
a leer es 108 (tres cifras).
charac= reception.read(x).decode()
k=0
matrix=np.zeros((m,n))
Una vez que se lee x, eso nos permite saber la cantidad de caracteres que tendrá
que leer la variable que almacenará el valor en caracteres de la matriz, en este
caso charac (de ‘character’, carácter en inglés). Se lee charac y con la función
decode() lo transformamos de cadena de bytes a cadena de caracteres. Creamos
una variable k y le damos un valor inicial 0, esta variable nos ayudará a iterar los
valores dentro de la matriz. Por último, creamos una matriz de ceros de orden m
por n.
for i in charac :
try:
i=int(i)
lista.append(str(i))
except: pass
for i in range(m):
for j in range(n):
lin=int(reception.read())
if lin==3:
matrix[i,j]=int(lista[k])
k=k+1
elif lin==4:
matrix[i,j]=int(lista[k]+lista[k+1])
k=k+2
else:
matrix[i,j]=int(lista[k]+lista[k+1]+lista[k+2])
k=k+3
Iteramos con ayuda de for dentro de la variable charac, lo cual nos permitirá leer
uno a uno los valores dentro de ella. Con ayuda de try, intentamos transformar
uno a uno los valores a enteros, si es posible hacerlo los ingresará en forma de
carácter dentro de lista, la variable tipo list creada anteriormente. Una vez creada
la lista, usamos los valores dentro de ella, que no son más que todos los números
ingresados en la matriz, y con ayuda de for iteramos dentro de cada uno de los
valores de la matriz y lo iremos cambiando por los valores dentro de lista.
Creamos un condicionante para saber la cantidad de datos que se debe ingresar
en la matriz, como en la anterior matriz (la enviada) los datos eran de tipo float
implica que los valores de una cifra tendrán 3 dígitos, de ahí que se pregunte si la
cantidad de valores a leer es tres o más. Si el valor es tres, se ingresará una cifra,
si es 4 se ingresará 2 y así sucesivamente.
NOTA: Este proceso se repite para ingresar y leer los datos de la segunda matriz.
print("La primera matriz enviada es:",matrix,"La segunda matriz ingresada
es:",matrix2,sep='\n')
Imprimimos con print las matrices uno y dos y añadimos un salto de línea como
separador entre cada elemento.
t=reception.read().decode()
if t=="1" :
try: print("El Determinante de la matriz 1 es:", np.linalg.det(matrix), "El
Determinante de la segunda matriz es:", np.linalg.det(matrix2), sep='\n')
except: print("Lo sentimos, al menos una de las matrices ingresadas no posee
determinante, a continuación, presentamos su traspuesta"); t="2"
if t=="2" :
print("La traspuesta de la matriz 1 es:", matrix.T, "La traspuesta de la segunda
matriz es:", matrix2.T, sep='\n')
if t=="3" :
print("La suma total matricial es:\n", matrix+matrix2)
if t=="4" :
print("El producto matricial es:\n", matrix@matrix2)
reception.close()
Por último, leemos t, que es el último valor enviado por el emisor, el cual elegirá
la operación a realizar. Si es 1 trata de imprimir el determinante de ambas
matrices, si es dos imprime la traspuesta de ambas, si es 3 suma las matrices y si
es 4 las multiplica, como las condiciones ya están dentro del programa emisor,
sabemos con seguridad que no se enviarán los datos 3 o 4 si no se cumplen las
condiciones de suma o multiplicación. Finalmente, cerramos el puerto con la
función close().
4. Conclusiones
Podemos concluir una vez realizada con éxito la práctica, que todo lo visto en
documentos introductorios a temas relevantes tratados en nuestro proyecto,
vienen a ser gran ayuda a la hora de intentar realizar nuestro código, desde el
comando mas simple y conocido, hasta los comandos nuevos aprendidos
durante la realización de nuestro proyecto.
5. Recomendaciones
Consultar datos importantes referentes a la práctica previo a su realización
Asegurarse de contar con todos los recursos adecuados necesarios para la
practica
El uso de ciertas librerías para facilitar el código a escribir
Apoyarse en documentos instructivos referentes al tema
6. Bibliografía
Todos estos apoyos fueron recuperados al Mes de Junio del 2019
Guías en distintos sitios de la web
Variedad de videos recuperados de:
https://www.youtube.com/
Variedad de documentos instructivos facilitados por:
https://docs.python.org/3/