Vous êtes sur la page 1sur 13

UNIVERSIDAD DE LAS FUERZAS ARMADAS - ESPE

Departamento de Eléctrica y Electrónica

Carrera: Telecomunicaciones

Informe: Comunicación Serial

Integrantes:
Ariel Aulestia Hermosa
Joao Cruz Veliz
Eduardo Espinosa Santafe

Asignatura: Herr. Software para Ingeniería


NRC: 5037

Docente: Ing. Jaime Andrango


1. Introducción

En esta práctica se realizará un intercambio de datos mediante un módulo


conversor ‘PL2303 Módulo RS232 a TTL con Plug USB A - Salida con Pines
(3.3V, 5V)’, con el fin de comprender os conceptos básicos sobre
transmisión serial de datos, enviando datos de un ordenador para procesar
e interpretar esos datos en otro ordenador, todo esto mediante el
interprete ‘Python’.

2. Marco Teórico

2.1. Python

Es un lenguaje de programación interpretado de alto nivel (hace hincapié


en una sintaxis que favorezca un código legible). Se trata de un lenguaje de
programación multiparadigma, ya que soporta orientación a objetos,
programación imperativa y, en menor medida, programación funcional. Es
un lenguaje interpretado, de tipado fuerte y dinámico y multiplataforma.

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

"Estándar Recomendado 232", también conocido como “EIA/TIA RS-


232C”, es una interfaz que designa una norma para el intercambio de
datos binarios serie entre un DTE ( "Equipo Terminal de Datos"), como
por ejemplo una computadora, y un DCE ("Equipo de Comunicación de
Datos"), por ejemplo un módem. Existen otros casos en los que también
se utiliza la interfaz RS-232. En particular, existen ocasiones en que
interesa conectar otro tipo de equipamientos, como pueden ser
computadoras. Evidentemente, en el caso de interconexión entre los
mismos, se requerirá la conexión de un DTE con otro DTE. Para ello se
utiliza una conexión entre los dos DTE sin usar módem, por ello se llama
módem nulo (null modem). El RS-232 consiste en un conector tipo DB-
25 (de 25 pines), aunque es normal encontrar la versión de 9 pines (DE-
9, o popularmente mal denominados DB-9), más barato e incluso más
extendido para cierto tipo de periféricos (como el ratón serie de la PC).

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

Con un mensaje informamos que se solicita el número de filas y columnas de la


primera matriz, con ayuda de try, intentamos transformar el valor ingresado en
entero, si el valor ingresado es mayor a 9, me imprime un mensaje informando
que el valor máximo ingresado solo puede ser 9 y almacena ese valor en la
variable, en el caso de que el valor ingresado no pueda ser transformado a
entero, me imprime un menaje informando que se tomará a 2 como valor y lo
almacena en la variable. Esto ocurre tanto en columnas como en filas de la
primera y segunda matriz.

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())

Creamos a transmission, un objeto lógico que simbolizará la conexión con el


puerto elegido como emisor, en este caso COMX. Una vez creada la conexión con
el puerto, enviamos los datos con ayuda de la función write, pero write solo
puede enviar datos de tipo byte o cadena de bytes por medio de serial, en tal caso
todos los valores que deseen ser enviados deben ser transformados a cadena de
bytes. Esto es posible con la función encode(), pero esta sólo transforma cadenas
de caracteres en cadenas de bytes de manera que a los datos enviados los
pasamos primero a cadena de caracteres con str(x), y luego a cadena de bytes con
encode(). El orden en que se envían los datos es:
# de filas
# de columnas
# completo de caracteres de la matriz (incluyendo corchetes y saltos de línea)
la matriz completa (incluyendo corchetes y saltos de línea)
# de caracteres de cada uno de los valores de la matriz
NOTA: Este proceso es repetitivo para ingresar y enviar los valores dentro de la
matriz 2.

if f1==f2 and c1==c2 :


s="Para sumar ingrese 3"
else:
s=""
if c1==f2 :
m="Para multiplicar ingrese 4"
else:
m=""
print("Que operación realizará:\nPare hallar el Determinante de ambas matrices
ingrese 1,\nPara hallar la traspuesta de ambas matrices ingrese 2 ", s, m,sep='\n')

Si el número de filas y columnas en ambas matrices coinciden, guardará el


mensaje “Para sumar ingrese 3” dentro de la variable s, caso contrario esta
variable no tendrá nada en ella. El mismo caso es para la variable m, si se cumple
que las columnas de la primera matriz sean iguales a las filas de la segunda, se
guarda el mensaje “Para multiplicar ingrese 4”, caso contrario la variable queda
vacía. Una vez definidas las variables, imprimimos un mensaje que pregunte la
acción que desea realizar el usuario y adjuntamos las variables m y s, si se
cumplen las condiciones anteriores, se mostrarán en el mensaje, si no es así, sólo
se mostrará el mensaje dentro de print()
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

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()

3.2. Programa Receptor | Reception


import numpy as np
import serial as s

Importamos las librerías numPy y serial y les asignamos las variables np y s


respectivamente.

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/

Vous aimerez peut-être aussi