• Lunes 23 de Diciembre de 2024, 18:27

Autor Tema:  Inicio De Proyecto  (Leído 6610 veces)

Carlitros82

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Inicio De Proyecto
« en: Domingo 10 de Junio de 2007, 05:33 »
0
Buenas, he empezado el proyecto de fin de carrera en el que utilizo un sensor que conecta directamente al puerto serie del ordenador. Utilizo este programa que he realizado para MATLAB:

s = serial('COM4');
set(s, 'BaudRate', 38400)
set(s, 'DataBits', 8)
set(s, 'Parity','none')
set(s, 'StopBits', 1)
set(s, 'FlowControl', 'none')
fopen(s)
fprintf(s,'G')
out = fscanf(s)
fclose(s)
delete(s)
clear s

y por pantalla lo que me da es lo siguiente:

Warning: A timeout occurred before the Terminator was reached.
out = ÿ

Alguien sabe a que se debe ese warning.
Y otra pregunta que tengo es que este sensor envia un paquete de formato de datos codificado de la siguiente manera:

El sensor envia 22 bytes, el byte #0 es el de cabezera y lleva el valor 255.
el byte #1 es el MSB de la medida 1
el byte #2 es el LSB de la medida 1
el byte #3 es el MSB de la medida 2
el byte #4 es el LSB de la medida 2
......
.....
El ultimo bytye, el byte #21 es el checksum

¿Cual serie el programa para descodificarlo y poner las medidas en un array? Gracias de antemano por la ayuda porque mi nivel de programación es ridiculo, jejeje.

fa61an

  • Miembro MUY activo
  • ***
  • Mensajes: 100
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #1 en: Lunes 11 de Junio de 2007, 01:51 »
0
Yo guardaria la lectura 1 en una variable de 16 bits, ya que dices que el primer Byte es el MSB y el Byte que le sigue es el LSB entonces como el puerto serie puede manejar entre 8 y  9 bits pues lo almaceno y con un for los concateno ...


Nunca he usado el puerto Serie por el matlab,,, pero supongo que lo que te dice el que debes especificar el TIME Out,  ahi algunos dispositivos que necesitan este time out, cuando utilizan el puerto, recuerdo que hacde poco use un PLC que necesita 500mS de Timeout y antes de fijarle ese valor no me funcionaba, claro esta que la aplicacion la realice en LABVIEW y no en Matlab...

Me imagino que ya probaste la captura de datos con el Hyperterminal... !!! y si es asi podras caracterizar tu sensor..

Por ejemplo si fuera un sensor que entregue medida de distancia, entonces primero mirar la hojas de datos para obtener la curva del sensor , segundo fijar una distancia conocida y mirar que datos me entraga y con esto lo podras caracterizar.

Carlitros82

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #2 en: Lunes 11 de Junio de 2007, 17:23 »
0
Gracias por la respuesta, ya he entendido lo del timeout. Pero sigo sin poder descodificar los datos. El sensor me envia un paquete de datos y tanto en hyperterminal como en matlab solo veo caracteres extraños.

Al parecer lo que debo hacer es localizar el byte de cabecera y guardar los datos en arrays (que tampoco se como se hace) y a esos datos guardados en las arrays no se si tendre que dividirle o multiplicarle o algo asi por el checksum, estoy muy perdido.

Gracias de antemano.

allisap

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #3 en: Lunes 11 de Junio de 2007, 17:55 »
0
mira lo de los caracteres extraños probablemente sea poque el sensor entrega la medicion en forma binaria, y si la envias directamente al hiperterminal trabaja con valores de caracteres ascii, es decir si tu sensor te envia un 65 binario en el hiperterminal aparecera una A (la A es un 65 en ascii) y asi con todos los valores

en matalab deberia arreglarse si en lugar de leer del sensor caracteres lees los bytes como enteros

Carlitros82

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #4 en: Martes 12 de Junio de 2007, 17:26 »
0
Cita de: "allisap"
mira lo de los caracteres extraños probablemente sea poque el sensor entrega la medicion en forma binaria, y si la envias directamente al hiperterminal trabaja con valores de caracteres ascii, es decir si tu sensor te envia un 65 binario en el hiperterminal aparecera una A (la A es un 65 en ascii) y asi con todos los valores

en matalab deberia arreglarse si en lugar de leer del sensor caracteres lees los bytes como enteros
¿y como hago eso? es que de programar no tengo mucha idea.

allisap

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #5 en: Martes 12 de Junio de 2007, 18:31 »
0
Saludos :)

En el hiperterminal no lo puedes hacer, ya que transforma los valores que recibe desde el serial a caracteres ascii,

en matlab creo que lo puedes hacer con fread, checalo en la ayuda

Carlitros82

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #6 en: Martes 10 de Julio de 2007, 19:42 »
0
Ya he conseguido introducir el paquete de datos en un array con la funcion fread. Pero no se como identificar el byte de cabecera para que lo guarde desde ahí. Y tampoco se como se haría la comprobación con el cheksum. Tampoco se como se juntan dos bytes, es decir tengo msb, lsb y los tengo que unir (se que arriba alguien me dijo que con un for pero no se hacerlo  :( ). Alguna idea? Gracias.

fa61an

  • Miembro MUY activo
  • ***
  • Mensajes: 100
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #7 en: Sábado 18 de Agosto de 2007, 20:40 »
0
Hoy se me dio por revisar los mensajes en donde he contestado y como me ha pasado en otros temas, no recibí notificación de nuevas respuestas espero que esto se arregle pronto..

Para lo cheksum, depende de que método se realice en el PLC, conozco uno que es hacer la función lógica Xor de cada byte recibido y luego comparar, hay otro que es sumar y luego invertir los bits.... hay varios métodos como te dijo, pero por lo general esos métodos implica realizar una función lógica digital, recomedaria que buscaras el protocolo que utiliza el dispositivo..

En matlab no recuerdo como hacerlo pero debe haber alguna función de concatenar bits... se hacerlo en Labview pero no en matlab...

Buscare a ver si encuentro como hacerla en Matlab

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Inicio De Proyecto
« Respuesta #8 en: Sábado 18 de Agosto de 2007, 23:11 »
0
En MATLAB concatenas así:

Código: Text
  1.  
  2. c = [ MSB LSB ]
  3.  
  4.  
Lo que tienes que verificar es el orden de los bits en cada byte, si el bit más significativo lo tienes a la derecha o a la izquierda.

Si deseas invertir un vector, lo puedes hacer así:
Código: Text
  1.  
  2. m = [ 1 2 3 4 ]
  3. invertida = m(4:-1:1)
  4.  
  5.  

Suerte.
La imaginación es el límite.
Hardware & Software | Mexchip

fa61an

  • Miembro MUY activo
  • ***
  • Mensajes: 100
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #9 en: Domingo 19 de Agosto de 2007, 01:56 »
0
Citar
  En MATLAB concatenas así: c = [ MSB LSB ]

NO me convence pues esa linea lo que hace es crear un arreglo o array con dos posiciones, pues si por ejemplo escribes esto c(1) te dará el valor del MSB, o si escribes c(2) te dará el LSB eso quiere decir que no se concateno......... si que se creo un array con dos posiciones no es lo mismo que concatenar... la verdad investigue y no encontre como hacerlo en matlab, se hacerlo en LabVIEW, la verdad es que no me gusta como se manajas los tipos de datos en matlab. no se por ejemplo como hacer para crear una variable int de 8 bits, o por ejemplo crear una Char 8 bits..

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Inicio De Proyecto
« Respuesta #10 en: Lunes 20 de Agosto de 2007, 04:16 »
0
En MATLAB se trabaja con matrices, los datos contenidos en ellas pueden ser de varios tipos.

Teniendo dos vectores, puedes crear un tercero que sea el resultado de unir los dos primeros así:

Código: Text
  1.  
  2. >> a = [ 1 2 3 4 ]
  3.  
  4. a =
  5.  
  6.      1     2     3     4
  7.  
  8. >> b = [ 5 6 7 8 ]
  9.  
  10. b =
  11.  
  12.      5     6     7     8
  13.  
  14. >> c = [ a b ]
  15.  
  16. c =
  17.  
  18.      1     2     3     4     5     6     7     8
  19.  
  20. >>
  21.  
  22.  
La imaginación es el límite.
Hardware & Software | Mexchip

fa61an

  • Miembro MUY activo
  • ***
  • Mensajes: 100
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #11 en: Lunes 3 de Septiembre de 2007, 21:51 »
0
Insisto eso no quiere decir que los concateno, ademas estamos hablado de bits recibidos por el puerto serial.

no es lo mismo

12 que equivale en binario --->00010010

a un array de dos posiciones [1 2] en el cual si representamos cada valor por 8 bits daria

1 ----> 00000001    
2 ----> 00000010    

Para nada es lo mismo, el echo que el promt de matlab los muestre como si estuvieran juntos para nada lo mismo decir el array [1 2], al numero 12.


El esta hablando que el PLC envía sus datos de a 16 bits y como el puerto serie como máximo maneja 9 bits entonces se le propuso que recibiera dos tramas de a 8 bits y luego los concatene y luego convertilo a double para tener su valor.


El ultimo ejemplo digamos, que el PLC va a enviar el numero 300 por el puerto serial , para hacer esto yo conozco una manera que seria enviar tres bytes de a 8 bits y luego verificar si todo se recibió bien con un byte de checksum.

Esos tres bytes estarían conformados por su equivalente en ASCII "podría ser" de cada cifra.

3 ----- > 0011 0011
0 ----- > 0011 0000
0 ----- > 0011 0000

Y luego se procedería a concatenar cada carácter OJO carácter no bytes, en una sola variable tipo String de valor "300" pero no es lo mismo "CONCATENAR" como tu lo dices en una matriz, de un tipo de dato Llamado Array de la siguiente manera [3 0 0], eso quiere decir que creaste una array con tres posición pero no una sola variable de valor 300

Carlitros82

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #12 en: Viernes 7 de Marzo de 2008, 20:21 »
0
Cita de: "fa61an"
Insisto eso no quiere decir que los concateno, ademas estamos hablado de bits recibidos por el puerto serial.

no es lo mismo

12 que equivale en binario --->00010010

a un array de dos posiciones [1 2] en el cual si representamos cada valor por 8 bits daria

1 ----> 00000001    
2 ----> 00000010    

Para nada es lo mismo, el echo que el promt de matlab los muestre como si estuvieran juntos para nada lo mismo decir el array [1 2], al numero 12.


El esta hablando que el PLC envía sus datos de a 16 bits y como el puerto serie como máximo maneja 9 bits entonces se le propuso que recibiera dos tramas de a 8 bits y luego los concatene y luego convertilo a double para tener su valor.


El ultimo ejemplo digamos, que el PLC va a enviar el numero 300 por el puerto serial , para hacer esto yo conozco una manera que seria enviar tres bytes de a 8 bits y luego verificar si todo se recibió bien con un byte de checksum.

Esos tres bytes estarían conformados por su equivalente en ASCII "podría ser" de cada cifra.

3 ----- > 0011 0011
0 ----- > 0011 0000
0 ----- > 0011 0000

Y luego se procedería a concatenar cada carácter OJO carácter no bytes, en una sola variable tipo String de valor "300" pero no es lo mismo "CONCATENAR" como tu lo dices en una matriz, de un tipo de dato Llamado Array de la siguiente manera [3 0 0], eso quiere decir que creaste una array con tres posición pero no una sola variable de valor 300
Gracias por las contestaciones al final lo he conseguido

A=[dec2bin(B(1)),dec2bin(B(2))];
C=bin2dec(A);

y así concateno 2 numeros decimales.

Ahora me encuentro con la duda de como realizar un complemento a 2.  Lo principal sería hacer el complementario al binario pero no se como.

Gracias por la ayuda. Un saludo.

fa61an

  • Miembro MUY activo
  • ***
  • Mensajes: 100
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #13 en: Sábado 8 de Marzo de 2008, 18:29 »
0
Parece interesante tu metodo  lo probrare pero pues con el ejemplo del numero 300 yo lo habia pensado hacer de la siguiente manera

Primero se recibe el caracter '3' se conviente a entero y se multimplica por 100 ("en el caso de que solo se reciban 3 cifras") luesgo se recibe el caracter '0' se convierte a entero y se multiplica por 10....

espero me entiendas la idea

mardedudas

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #14 en: Lunes 10 de Marzo de 2008, 10:38 »
0
He lsedo por encima el problema de concatenar.

No se si usando la función "strcat" podría solucionarse el problema.
s=strcat('hola','pepe');
s='holapepe'

si guarda las cadenas de bits en variables y luego usa la función strcat eso se las concatena.

Un saludo.
No se si esto ha servido, aunque ya hayas encontrado la solución.

Carlitros82

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Inicio De Proyecto
« Respuesta #15 en: Martes 11 de Marzo de 2008, 18:17 »
0
Cita de: "fa61an"
Parece interesante tu metodo  lo probrare pero pues con el ejemplo del numero 300 yo lo habia pensado hacer de la siguiente manera

Primero se recibe el caracter '3' se conviente a entero y se multimplica por 100 ("en el caso de que solo se reciban 3 cifras") luesgo se recibe el caracter '0' se convierte a entero y se multiplica por 10....

espero me entiendas la idea
Si te entiendo, pero el problema es que lo que me manda el sensor son datos de 16 bits en complemento a 2. Y Matlab me lee 8 bits y me lo da en decimal. Por eso paso cada numero a binario y las uno para ahora intentar deshacer el complemento a 2 y saber que valor es realmente.

Pero tu idea es buena, el problema es que trabajo con Matlab. Gracias de nuevo.

diego_barragán

  • Visitante
Re: Inicio De Proyecto
« Respuesta #16 en: Miércoles 12 de Marzo de 2008, 03:15 »
0
Usa la herramiento >>tmtool para chequear el puerto serial.