TODOPIC
Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: alavai en 16 de Octubre de 2006, 07:51:47
-
Hola a todos y enhorabuena por este sitio tan poderoso.
Agradecería enormemente que me echaran una mano, pues estoy completamente perdido. El caso es que una vez consiga recibir la información que necesito de este dispositivo, podré empezar a hacer cosas...
El caso es que estoy intentando conectarme a un dispositivo de mi coche a través del puerto serie.
Me conecto, sí, pero estoy completamente perdido y no sé por donde empezar.
Aquí las instrucciones que me han enviado los fabricantes del aparato.
> > Zeitronix Zt-2 Wideband Air Fuel Ration Meter Output Data Format
> >
> > RS 232
> >
> > Baud rate 9600
> >
> > Data 8 bit
> >
> > Parity None
> >
> > Stop 1 bit
> >
> > Flow Control None
> >
> > Header block
> > #00 null heading
> >
> > #01 start heading
> >
> > #02 start text
> >
> > Data block: data format
> >
> > AFR HEX 8 bit
> >
> > EGT LSB HEX 16 bit
> >
> > EGT MSB HEX 16 bit
> >
> > RPM LSB HEX 16 bit
> >
> > RPM MSB HEX 16 bit
> >
> > Boost LSB HEX 16 bit
> >
> > Boost MSB HEX signed
> >
> > TPS HEX 8 bit
> >
> > User1 HEX 8 bit
> >
> > Config Register HEX 8 bit
> >
> > Possible check sum of all of the above. Not implemented at this point.
> >
> > Data details:
> >
> > All 8 bit and 16 bit numbers need to be converted to decimal
equivalents.
Os doy las gracias por anticipado.
-
Hola alavai:
Creo que deberías aportar un poco más de información para que se te pueda ayudar. Cuando dices que te conectas, ¿qué quieres decir¿ ¿qué te estás conectando con un PIC o directamente con un ordenador?
Imagino que ya lo habrás visto, pero por si acaso te dejo el enlace a un software para PDA específico para el equipo que estás usando software Zt-2 (http://www.pocketlogger.com/index.php?pid=plzt)
Saludos,
-
Hola alavai:
Creo que deberías aportar un poco más de información para que se te pueda ayudar. Cuando dices que te conectas, ¿qué quieres decir¿ ¿qué te estás conectando con un PIC o directamente con un ordenador?
Imagino que ya lo habrás visto, pero por si acaso te dejo el enlace a un software para PDA específico para el equipo que estás usando software Zt-2 (http://www.pocketlogger.com/index.php?pid=plzt)
Saludos,
hola y gracias por responder.
me conecto desde un pc con visual basic a una cajita que contiene electrónica que es la que tiene un puerto serie al que me tengo que conectar para que me envie la informacion en tiempo real de lo que está pasando.
sí ya he visto el software, pero necesito recibir esta información para preparar una plataforma de cara a compartir informaci´no con otros usuarios en el mismo formato, etc...
-
Entonces ¿lo que necesitas es que se te ayude a crear un programa en Visual Basic para poder leer los datos que se reciben por el puerto serie?
¿Has probado con el programa HyperTerminal de Windows a ver si se recibe efectivametne algo?
-
Entonces ¿lo que necesitas es que se te ayude a crear un programa en Visual Basic para poder leer los datos que se reciben por el puerto serie?
¿Has probado con el programa HyperTerminal de Windows a ver si se recibe efectivametne algo?
efectivamente.
me llegan datos, pero el tema es que no sé qué hacer con ellos, ni como agruparlos ni como leerlos...
es un pequeño empujón lo que necesito para poder interpretar lo que viene y agruparlo en función de lo que me dice esta gente con la info que me han enviado. Una vez recupere cada valor, ya sigo :)
Muchísimas gracias!!!
-
¿Podrías copiar aquí un ejemplo de los datos que recibes? De este modo quizás podamos descifrar cómo se relacionan con la información que pusiste en tu primer post.
-
¿Podrías copiar aquí un ejemplo de los datos que recibes? De este modo quizás podamos descifrar cómo se relacionan con la información que pusiste en tu primer post.
ok. ahora mismo lo pongo.
voy a sacar la info de distintos emuladores.
uno de mis grandes problemas es que no sé qué valores poner en:
Comm1.RThreshold
Comm1.InBufferSize
Comm1.InputLen
voy a poner en un momento los datos
-
volcado de una captura en ascii:
(http://www.traccionintegralturbo.com/materialdelforo/vivaldi/capturaascii.JPG)
volcado de una captura en hex:
(http://www.traccionintegralturbo.com/materialdelforo/vivaldi/capturahex.JPG)
Aquí ya se puede ver la cadena 00 01 02 que precede cada churro de datos.
-
Más info del fabricante.
Acabo de darme cuenta de que había puesto solamente parte de la info que me han enviado. :?
> > Data details:
> >
> > All 8 bit and 16 bit numbers need to be converted to decimal
equivalents.
> >
> >
> > AFR (Air Fuel Ratio)
> >
> > AFR = Lambda x 14.7.
> >
> > AFR Range from 9.5 to 21.1. AFR data needs to be divided by 10
> >
> > RPM
> > 16 bit number is a time between two events (crank angle sensor).
> >
> > RPM=60/(Cm*MSB,LSB*26.0416*10^-6)
Importante!
De estos valores, solamente deben llegar 2, que son el AFR y las RPMS. los demás sensores no están conectados.
-
Hola alavai :) con respecto a tus preguntas
uno de mis grandes problemas es que no sé qué valores poner en:
Comm1.RThreshold
Comm1.InBufferSize
Comm1.InputLen
la propiedad RThreshold solo es necesaria si utilizas el evento OnComm, debes pensar muy bien el valor que se le pone. Si ponemos un valor corto (1 es el mínimo), cada vez que reciba un carácter se producirá el evento OnComm.
el puerto serial en visual basic trabaja solamente en ascii aunque el equipo los envie en hexa el puerto los recibe en ascii en tu caso, esto:
> > AFR HEX 8 bit
> > RPM LSB HEX 16 bit
> > RPM MSB HEX 16 bit
AFR mandara un caracter y los RPM 2 caracteres cada uno, pero hay que pensar bien que pondras ahi porque debes considerar tambien los 00 01 02 que te esta enviando (serian otros 3 caracteres) pero segun los datos que posteaste estas recibiendo mas :shock:.
con esta propiedad Comm1.InBufferSize establecemos el tamaño del Buffer (almacén de datos) de entrada.
Puede conocerse el número de caracteres presentes en el Buffer de entrada consultando el valor de la propiedad InBufferCount..
Por defecto, cuando se lee el Buffer de recepción, se leen todos los caracteres, quedando el Buffer vacío. Si se le asigna a Comm1.InputLen un valor distinto de 0, cada vez que leamos el Buffer de recepción leerá un número de caracteres igual a esa cantidad, permaneciendo los caracteres restantes en el Buffer a la espera de una nueva lectura. Asignándole el valor 0 (Valor por defecto), el buffer se lee completo.
ahora con respecto a la interpretacion de los datos tengo unas preguntas, segun la informacion que te dio el fabricante antes de enviar los datos envia la cadena 00 01 02 tal como te muestra el hyperterminal despues de esto supuestamente te envia AFR (8 bits) y luego RPM (32 bits), 40 bits en total (10 numeros hexadecimales) pero entre cada cadena 00 01 02 hay el doble 80 bits (20 numeros hexadecimles) ¿estas seguro de que solo esta enviando estos datos? ¿asi como esta la cadena 00 01 02 para iniciar habra otra para finalizar?
saludos :-/
-
Yo veo que se reciben en total 13 bytes por tanda.
Los primeros 3 bytes son el ID del mensaje 00 01 02, y los otros 10 el cuerpo del mensaje.
Lo que no coincide es que en la supuesta informacion tecnica que das del cuerpo del mensaje, tenes al menos 15 bytes, y aca solamente estas recibiendo constantemente 10 bytes de datos por tanda.
Tal vez la longitud de la cadena varia segun los datos del usuario, log in,etc.
El ID del final del mensaje puede ser el mismismo ID de inicio del proximo mensaje...
si tengo 00 01 02 ..........X bytes.............00 01 02
se que restando la posicion del segundo 00 a la del primer 02 + 1 me da la longitud del mensaje(es decir, X bytes) y por lo tanto puedo procesarlo.
Si existe un checksum al final del mensaje( es decir, comprobacion de datos correctos) probablemente se compruebe haciendo una operacion logica XOR entre todos los bytes recibidos, y verificando que el valor obtenido sea igual al ultimo byte de la tanda.
Saludos.
-
Muchas gracias por la atención que me estais prestando y disculpas por no aparecer por aquí ayer, pero es que estuve fuera y no pude.
A ver; lo que realmente me interesa de este aparato es que me de las rpms y el AFR.
Dentro de 2 horas pondré de nuevo la pantalla que copio del terminal (como la que puse más arriba) y los valores que da el programa original para ver si conseguimos "descifrarlos".
Una vez más, muchas gracias por la atención que me estais prestando.
-
Hola de nuevo a todos.
A ver, ya he conseguido leer los caracteres hex, pero sigo sin ser capaz de descifrar qué significan.
Tengo el 00, el 01 y el 02 seguido de 10 caracteres hex
Un ejemplo es el siguiente:
92 c8
00 c0
05 ff
ad 01
8c fe
a tener en cuenta que solamente necesito las rpms y el afr qué según dice el fabricante sería el afr los 8 primeros bits y las rpms el segundo paquete de 16 +16
leído con el programa que viene con el dispositivo, los valores que me muestra para estos hex que he puesto son:
rpms varía entre 780 y 810
afr varía entre 14.50 y 14.80
gracias por anticipado por vuestra inestimable ayuda.
como "desencriptar esto?
-
oops, tengo que pedir disculpas, pues me he hecho un lío.
los datos hex los veo en el terminal y convirtiendo el primer byte del paquete a decimal, pues es el valor del afr.
mi problema sigue siendo que no soy capaz de obtener los datos en hex desde el visual basic.
me estoy volviendo loco dle todo
-
En hexadecimal no vas a poder obtenerlos directamente. El VB sólo recibe como STRING.
Sea en ASCII o en binario,ambos son de tipo string.
El binario es un engaño en realidad,es una cadena de 8 caracteres ASCII 0 y 1, pero STRING al fin y al cabo.
Tampoco te conviene pasarlos a HEX, sino a decimal.
Proba con este programa que te adjunto.
Conecta el "aparato" al Puerto serie 1, y primero hace click en comenzar. Despues encende el aparato.
Los datos deberian ir saliendo en el cuadro de texto, todos en formato decimal.
A partir de ahi, comenzamos.
Saludos.
-
Hola alavai :) con respecto a tus preguntas
uno de mis grandes problemas es que no sé qué valores poner en:
Comm1.RThreshold
Comm1.InBufferSize
Comm1.InputLen
la propiedad RThreshold solo es necesaria si utilizas el evento OnComm, debes pensar muy bien el valor que se le pone. Si ponemos un valor corto (1 es el mínimo), cada vez que reciba un carácter se producirá el evento OnComm.
el puerto serial en visual basic trabaja solamente en ascii aunque el equipo los envie en hexa el puerto los recibe en ascii en tu caso, esto:
> > AFR HEX 8 bit
> > RPM LSB HEX 16 bit
> > RPM MSB HEX 16 bit
AFR mandara un caracter y los RPM 2 caracteres cada uno, pero hay que pensar bien que pondras ahi porque debes considerar tambien los 00 01 02 que te esta enviando (serian otros 3 caracteres) pero segun los datos que posteaste estas recibiendo mas :shock:.
con esta propiedad Comm1.InBufferSize establecemos el tamaño del Buffer (almacén de datos) de entrada.
Puede conocerse el número de caracteres presentes en el Buffer de entrada consultando el valor de la propiedad InBufferCount..
Por defecto, cuando se lee el Buffer de recepción, se leen todos los caracteres, quedando el Buffer vacío. Si se le asigna a Comm1.InputLen un valor distinto de 0, cada vez que leamos el Buffer de recepción leerá un número de caracteres igual a esa cantidad, permaneciendo los caracteres restantes en el Buffer a la espera de una nueva lectura. Asignándole el valor 0 (Valor por defecto), el buffer se lee completo.
ahora con respecto a la interpretacion de los datos tengo unas preguntas, segun la informacion que te dio el fabricante antes de enviar los datos envia la cadena 00 01 02 tal como te muestra el hyperterminal despues de esto supuestamente te envia AFR (8 bits) y luego RPM (32 bits), 40 bits en total (10 numeros hexadecimales) pero entre cada cadena 00 01 02 hay el doble 80 bits (20 numeros hexadecimles) ¿estas seguro de que solo esta enviando estos datos? ¿asi como esta la cadena 00 01 02 para iniciar habra otra para finalizar?
saludos :-/
Muchas gracias por tu ayuda.
Sí estoy seguro de que no recibo nada más.
Según veo en el terminal, se repite la secuencia 000102 que marca el principio del bloque.
No sabría decirte si hay algo que marque el final, aunque la cadencia es siempre la misma.
Si solamente llega ASCII, creo que estas 2 preguntas ya sabría, creo, encontrar alguna salida.
1.- De qué manera puede hacer para leer el puerto de 1 en 1 byte? Una vez pueda hacer esto, ya será cuestión de interpertarlos. Según he comprobado en el terminal, los valores que recibe sí cuadran con los datos que tienen que ser.
2.- De qué manera recibirlos en hexadecimal o decimal?
Gracias de antemano
-
Fijate que te respondi mientras escribias este ultimo mensaje.Saludos.
-
ok
muchisimas gracias!!! :P
-
pues sigo con el tema y sigo volviéndome loco.
a ver si puedes echame otra mano y ya queda listo el tema.
el tema del AFR está listo.
pero ahora con las RPM estoy otra vez parado :?
la fórmula que te dije ayer del otro foro, BrunoF, no sirve, pues los datos no llegan de la misma forma.
la formula que hay que aplicar es esta:
RPM=60/(4*MSB,LSB*26.0416*10^-6)
los datos que me llegan a ralentí son estos, y debería salir un valor en torno a las 800-900 rpms.
(http://www.traccionintegralturboservicios.com/archivos/images/60378300_1161254147.JPG)
A ver si puedes echarme otra vez una mano salvadora.
Gracias de antemano.