Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-03-2009
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 233
Poder: 16
espinete Va camino a la fama
Exclamation Envío de datos a balanza puerto serie

Hola...

Llevo varios días peleándome con una balanza por puerto serie. La comunicación funciona, ya que he conseguido enviar y recibir respuesta. El problema es que no siempre recibo respuesta, y seguramente se debe a que estoy enviando mal la cadena HEX a la balanza.

La balanza es de la marca DIBAL. Utilizo el protocolo TISA.
El formato de envío es el siguiente:

9 8 P P P P P C Cr Lf

Los dos primeros dígitos (9 y 8) son fijos.
PPPPP son los 5 dígitos para el precio
Cr es el retorno de carro (0D en HEX)
Lf es el Line Feed (0A en HEX)

El problema está en la posición "C".
Ahí debo poner la suma lógica (XOR) de todos los números anteriores.

Con algunas pruebas sí me responde la balanza, pero con otras no. Depende del peso/precio/etc... que devuelva la balanza, lo cual indica que, o bien estoy haciendo mal la suma XOR, o la balanza no me hace caso.

El siguiente ejemplo funciona:

ASCII: 98001505 + CR + LF

HEX: 39 38 30 30 31 35 30 35 0D 0A

En este ejemplo, la suma XOR es 5 (35 HEX).
La he obtenido con Delphi de la siguiete forma:

x := 39 xor 38 xor 30 xor 30 xor 31 xor 35 xor 30

Eso devuelve 35, y enviando esa cadena, la balanza responde perfectamente.

Sin embargo, si envío otra cadena, por ejemplo si el precio es 9,50, quedará de la siguiente forma:

HEX: 39 38 30 30 39 35 30 0D 0D 0A

¿Se hace así la suma lógica? ¿O hay que hacer algo más?
Puede incluso que en el manual de la balanza esté mal explicado. Dice textualmente "C es la suma lógica (XOR) de todos los números anteriores".
Y a saber si hay que contar el 98 del principio o no.

Muchas gracias por anticipado. Llevo varios días y sólo veo números cuando cierro los ojos
Responder Con Cita
  #2  
Antiguo 09-03-2009
Avatar de krlox31416
krlox31416 krlox31416 is offline
Miembro
 
Registrado: jun 2008
Ubicación: San Juan del Río, Querétaro, México
Posts: 75
Poder: 16
krlox31416 Va por buen camino
me gustaria saber como queda tu código

tal vez si lo viera me daria ideas para hecharlo a andar...
componentes, librerias, etc...
saludos!!!
__________________
el cielo me dio un cariño sin merecerlo... chimikuilo!!!
Responder Con Cita
  #3  
Antiguo 09-03-2009
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 233
Poder: 16
espinete Va camino a la fama
Hola.

Gracias por la respuesta. Todavía no estoy usando ni componentes, ni librerías, ni nada. SImplemente estoy intentando hacer una suma XOR de varios números.

Con la calculadora de Windows, en modo "científica", y en Hex, la suma es correcta, pero haciendo lo siguiente...

x := 39 xor 39 xor 30.......

...no coincide. Imagino que se debe a que estoy sumando numeros enteros y no en HEX?
Responder Con Cita
  #4  
Antiguo 09-03-2009
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 233
Poder: 16
espinete Va camino a la fama
Ya lo he solucionado. Estaba calculando mal la suma lógica XOR de los números. Tenía primero que convertirlos a Integer, luego otra vez a HEX, luego el resultado a HEX y finalmente a ASCII, es decir, una vuelta de tuerca impresionante que no aparece en ningún manual.

Mañana intentaré postera el código exacto.
Responder Con Cita
  #5  
Antiguo 11-03-2009
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 233
Poder: 16
espinete Va camino a la fama
Aquí va el código que utilizo para calzular el checksum dichoso y enviar correctamente el resultado a la balanza.

En el ejemplo envío la siguiente cadena: 9 8 0 0 1 5 0 X Cr Lf

Código:
 
                  a:='30';
                  b:='30';
                  c:='31';
                  d:='35';
                  e:='30';
                  h:=inttohex(hextoint('39') xor hextoint('38'),1);
                  h:=inttohex(hextoint(h) xor hextoint(a),1);
                  h:=inttohex(hextoint(h) xor hextoint(b),1);
                  h:=inttohex(hextoint(h) xor hextoint(c),1);
                  h:=inttohex(hextoint(h) xor hextoint(d),1);
                  h:=inttohex(hextoint(h) xor hextoint(e),1);
 
                  //Cadena completa en HEX
                  edit21.text:='39'+'38'+a+b+c+d+e+h+'0D'+'0A';

                  //Cadena en ASCII (sin #13 ni #10)
                  edit19.text:=chr(hextoint('39'))+chr(hextoint('38'))+chr(hextoint(a))+chr(hextoint(b))+chr(hextoint(c))+chr(hextoint(d))+chr(hextoint(e))+chr(hextoint(h));

                  //Cadena ASCII completa (CON #13#10)
                  ApdComPort1.OutPut := edit19.text+#13+#10;
Responder Con Cita
  #6  
Antiguo 12-03-2009
Avatar de krlox31416
krlox31416 krlox31416 is offline
Miembro
 
Registrado: jun 2008
Ubicación: San Juan del Río, Querétaro, México
Posts: 75
Poder: 16
krlox31416 Va por buen camino
ingeniosa tu solución!!!

felicidades por que te quedo tu problema...

y si la verdad es que buscando ayuda o consultando en foros es como se hecha a andar nuestro codigo...

que bueno que fue un problema de conversion...

saludos!!!...
__________________
el cielo me dio un cariño sin merecerlo... chimikuilo!!!
Responder Con Cita
  #7  
Antiguo 15-04-2009
Steal Steal is offline
Registrado
 
Registrado: feb 2009
Posts: 5
Poder: 0
Steal Va por buen camino
Consulta

Hola, ¿podrías indicarme como haces para poder recuperar los datos que te manda la pesa de regreso?.
Quiero decir, si yo le mando un precio o no pero quiero recuperar el peso que hay en la balanza, ¿Que tengo que hacer?.
¿Tienes alguna documentación del protocolo Tisa?, ¿una lista de comandos o algo para poder recuperar los datos desde la balanza?.

Un saludo.
Responder Con Cita
  #8  
Antiguo 15-04-2009
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 233
Poder: 16
espinete Va camino a la fama
Hola...

Para recibir la respuesta de la balanza no hay que hacer nada. Una vez envíes la cadena con el componente, el propio componente se encarga de recibir la respuesta en un evento propio. Ahora mismo no recuerdo qué evento es y qué código hace falta porque no estoy en el trabajo.

En cuanto a la documentación sobre el protocolo TISA, o cualquier otro protocolo, lo mejor es que consultes el manual de la balanza. Si no lo tienes, en Internet o en la web del fabricante seguro que lo encuentras.

Siento no poder ayudarte más en este momento.
Responder Con Cita
  #9  
Antiguo 20-04-2009
Steal Steal is offline
Registrado
 
Registrado: feb 2009
Posts: 5
Poder: 0
Steal Va por buen camino
Gracias, trataré de ver si encuentro algo más sobre el protocolo TISA, pues quería pasarle pesos de TARA etc...

Si tienes algún código completo de ejemplo de como funciona el objeto de comunicaciones... espero que no sea pedir mucho, es que por más que busco ejemplos casi no encuentro nada, y con la documentación que viene con el paquete de componentes tampoco es que me queda muy claro.

Gracias y un saludo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Recibir datos del puerto serie en bytes. REHome .NET 1 31-10-2008 17:50:10
Puerto Serie / Envio De Datos alebarto C++ Builder 4 07-09-2008 22:46:58
Quiero tomar datos de puerto serie con Delphi4PHP lsg PHP 1 09-08-2008 03:24:37
Capturar datos por el puerto serie mierda Varios 8 05-12-2007 18:23:29
Envio de datos al puerto serie COM1 Niko Varios 5 15-03-2005 18:38:21


La franja horaria es GMT +2. Ahora son las 01:15:41.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi