Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Lectura Hexadecimal desde el puerto serie (https://www.clubdelphi.com/foros/showthread.php?t=49347)

djemix 19-10-2007 09:46:51

Lectura Hexadecimal desde el puerto serie
 
Hola a todos!!

Weno mi problema ha sido resumido en el titulo del hilo... pero lo voy a explicar algo mas claro.

El tema es que tengo que hacer un programa que lea desde un disposito lector chip que se comunica por hexadecimal. Yo uso los componentes AsyncPro y claro... cuando abro el COM1 y me pongo a escuchar me salen caracteres chinos, porque lo que uso para leer es la funcion GetChar del TAcpComPort.

Qué debo hacer para poder tener los datos correctamente en Hexadecimal??

Gracias por todo y un saludo!!

egostar 19-10-2007 20:53:09

Cita:

Empezado por djemix (Mensaje 239670)
Hola a todos!!

Weno mi problema ha sido resumido en el titulo del hilo... pero lo voy a explicar algo mas claro.

El tema es que tengo que hacer un programa que lea desde un disposito lector chip que se comunica por hexadecimal. Yo uso los componentes AsyncPro y claro... cuando abro el COM1 y me pongo a escuchar me salen caracteres chinos, porque lo que uso para leer es la funcion GetChar del TAcpComPort.

Qué debo hacer para poder tener los datos correctamente en Hexadecimal??

Gracias por todo y un saludo!!

Corrijeme si me equivoco, tienes bien configurados los parametros de comunicación :confused:, es decir, Velocidad, Bits de Datos, Bit de Stop

Comencemos con eso y después podemos verificar si hay otro problema.

Salud OS

djemix 22-10-2007 16:39:28

Exactamente eso es lo primero que estaba mirando y lo tengo que tener bien. Para hacer la prueba de que son los correctos uso un programa en ms-dos llamado DSCOPE que me hace la lectura correcta y luego tiene una tecla que me convierte los datos recibidos (caritas y simbolos) a hexadecimal y son datos correctos.

El componente que uso en mi aplicación para recibir los datos es del paquete Async Profesional y el componente ApdComPort.

Sabeis que solución puedo darle al tema??

Un saludo!

djemix 23-10-2007 10:59:13

Porfaaa!! A ver si me podeis echar una manilla con esto, que lo tengo atascao y no se como salir...

No me importa cambiar de componentes, simplemente he comentado el que uso, pero que puedo poner otro si arreglo el problema.

Gracias a todos!!

basti 23-10-2007 11:10:19

Los caracteres, los números en hexadecimal, binario o decimal, son los mismos datos representados de forma distinta. Probablemente, los datos que recibes sean correctos, pero no los muestras de la forma correcta.

Por ejemplo, si 's' es un string:
Código Delphi [-]
for i := 1 to lengt(s) do
begin
  lblChar.Caption := lblChar.Caption + s[i];
  lblHex.Caption := lblHex.Caption + format('%x ', ord(s[i]);
  lblDec.Caption := lblHex.Caption + format('%d ', ord(s[i]);
end;

djemix 25-10-2007 17:33:38

Muchas gracias tio!! Me ha venido genial!! jeje...

Pero ahora me surge otro problema... aunque este ya lo tenia desde hace tiempo... y me preguntado a ver si me lo podriais resolver...

A ver... cuando trabajo con puertos series tengo el problema de que cuando recibo una trama nunca la recibo entera de un tiron, sino que lo recibo en cachos, casi siempre de 8 en 8 caracteres... ¿porque me pasa esto?

¿Tengo que ajustar de alguna manera el componente que uso ( Async Pro)?

De todas formas si alguien me sugiere alguno que le funcione y sepa como hacerlo andar correctamente se lo estaría muy agradecido.

Un saludo a todos!!

egostar 25-10-2007 17:37:59

Cita:

Empezado por djemix (Mensaje 241117)
Muchas gracias tio!! Me ha venido genial!! jeje...

Pero ahora me surge otro problema... aunque este ya lo tenia desde hace tiempo... y me preguntado a ver si me lo podriais resolver...

A ver... cuando trabajo con puertos series tengo el problema de que cuando recibo una trama nunca la recibo entera de un tiron, sino que lo recibo en cachos, casi siempre de 8 en 8 caracteres... ¿porque me pasa esto?

¿Tengo que ajustar de alguna manera el componente que uso ( Async Pro)?

De todas formas si alguien me sugiere alguno que le funcione y sepa como hacerlo andar correctamente se lo estaría muy agradecido.

Un saludo a todos!!

Una alternativa muy buena es la de usar el componente apdDataPacket del mismo Apro, la única condicionante es que requieres conocer al menos el caracter de fin de la cadena.

Dale una leída a ese componente, puedo asegurarte que te va a servir de mucho.

Salud OS

djemix 25-10-2007 17:57:27

El problema que tengo es que no puedo saber el tamaño de la trama ya que puede variar segun lo que manden.

El otro problema es que SI conozco el caracter de comienzo y el de fin de trama pero el problema es que cualquiera de los se puede repetir en el interior de la trama...

¿¿que puedo hacer??

egostar 25-10-2007 18:17:03

Cita:

Empezado por djemix (Mensaje 241130)
El problema que tengo es que no puedo saber el tamaño de la trama ya que puede variar segun lo que manden.

El otro problema es que SI conozco el caracter de comienzo y el de fin de trama pero el problema es que cualquiera de los se puede repetir en el interior de la trama...

¿¿que puedo hacer??

Si puediras colocar aquí algunas lineas de lo que te llega podría ayudarte en este caso.

Salud OS

djemix 25-10-2007 18:54:06

El primer char es el STX (0x02) y el ultimo es el ETX(0x03). Esto esta muy bien pero el problema lo tengo dentro...

Luego viene el numero de argumentos y luego los argumentos... tantos como decia el numero de antes.

Despues viene un CRC que es la suma de los argumentos... y final el ETX.

Con esto te kiero hacer ver que el tamaño de la cadena es variable segun lo que me kieran mandar y claro... cuando me mandan 2 o 3 argumentos... el campo del numero de argumentos ya me coincide o con el ETX o STX.

¿Cual es el problemaaaaa? Pues que cuando recibo una cadena, por ejemplo, de 10 caracteres... Primero recibo los 8 primeros y luego los 2 siguientes...

Cuando digo que recibo me refiero al evento OnTriggerAvail del componente que me salta 2 veces. Siempre me saca los ocho primeros y luego el resto...

Nunca he comprobado en recibir por ejemplo 20 caracteres... para ver si me los divide en paquete de 8... Eso es algo de la configuración del puerto??

Ufff... vaya tocho que te soltado... a ver si te puedes aclarar un poco en todo eso..

Gracias por tu ayuda.... :o

egostar 25-10-2007 19:12:47

Cita:

Empezado por djemix (Mensaje 241164)
El primer char es el STX (0x02) y el ultimo es el ETX(0x03). Esto esta muy bien pero el problema lo tengo dentro...

Luego viene el numero de argumentos y luego los argumentos... tantos como decia el numero de antes.

Despues viene un CRC que es la suma de los argumentos... y final el ETX.

Con esto te kiero hacer ver que el tamaño de la cadena es variable segun lo que me kieran mandar y claro... cuando me mandan 2 o 3 argumentos... el campo del numero de argumentos ya me coincide o con el ETX o STX.

¿Cual es el problemaaaaa? Pues que cuando recibo una cadena, por ejemplo, de 10 caracteres... Primero recibo los 8 primeros y luego los 2 siguientes...

Cuando digo que recibo me refiero al evento OnTriggerAvail del componente que me salta 2 veces. Siempre me saca los ocho primeros y luego el resto...

Nunca he comprobado en recibir por ejemplo 20 caracteres... para ver si me los divide en paquete de 8... Eso es algo de la configuración del puerto??

Ufff... vaya tocho que te soltado... a ver si te puedes aclarar un poco en todo eso..

Gracias por tu ayuda.... :o

Esto se resuelve perfectamente con el componente que te comenté, además están usando el protocolo más efectivo para saber donde comienza y donde termina una cadena

Cita:

STX = Start of Text
ETX = End of Text
Dificilmente verás esos caracteres repetidos dentro de la cadena, si es así entonces no solo recibes una trama sino varias y siempre, repito siempre habrá un STX con su respectivo ETX.

El CRC como dices, es un digito verificador, comúnmente es un XOR de los caracteres dentro de la cadena, no uses el trigger avail, como te digo, usa el componente adpDataPacket, configuralo de esta forma

Cita:

EndCon = ecString
EndString = #3 --> [^C]
StartCond = scString
StartString = #2 --> [^B]
En el evento OnStringPacket del componente podrás usar esto:

Código Delphi [-]
procedure TForm1.ApdDataPacket1StringPacket(Sender: TObject; Data: String);
begin
  Memo1.Lines.Add(Data);
end;


Salud OS

djemix 26-10-2007 08:36:27

Esto lo he entendido perfectamente, pero es que el problema lo tengo cuando en el campo del numero de argumentos me viene el #3, que me cortaria el paquete ahi... ese es el problema que tengo al usar el datapaket...

egostar 26-10-2007 21:39:14

Cita:

Empezado por djemix (Mensaje 241331)
Esto lo he entendido perfectamente, pero es que el problema lo tengo cuando en el campo del numero de argumentos me viene el #3, que me cortaria el paquete ahi... ese es el problema que tengo al usar el datapaket...

Lo que entiendo es que te está llegando la información en varios paquetes, algo así:

Cita:

#2[DATOS]#3#2[DATOS]#3#2[DATOS]#3
Pienso que necesitas esperar a que termine de enviarte la información antes de procesar el registro completo.

Salud OS

djemix 26-10-2007 21:51:03

Claro, ese es el problema... Nunca se de primeras cual es el tamaño de la trama (para poder configurar el datapaket..) y tampoco puedo asegurar que dentro del campo de `[DATOS] no esté el #2 o el #3...

Por eso es lo que uso el Evento OnTriggerAvail para ir recogiendo los datos recibidos e irlos procesando uno a uno...

Por eso es en este caso cuando me sale el problema de que no me llega el paquete completo... sino que creo que me vienen los 8 primeros... y luego los siguientes............

egostar 26-10-2007 22:00:17

Cita:

Empezado por djemix (Mensaje 241532)
Claro, ese es el problema... Nunca se de primeras cual es el tamaño de la trama (para poder configurar el datapaket..) y tampoco puedo asegurar que dentro del campo de `[DATOS] no esté el #2 o el #3...

Por eso es lo que uso el Evento OnTriggerAvail para ir recogiendo los datos recibidos e irlos procesando uno a uno...

Por eso es en este caso cuando me sale el problema de que no me llega el paquete completo... sino que creo que me vienen los 8 primeros... y luego los siguientes............

Pues es que precisamente el apdDataPacket es para este tipo de cadenas variables ya que lo único que nos interesa es donde comienza y donde termina, no se si me estoy explicando.

Incluso puedes decirle al componente que no te ponga dichos caracteres en la cadena con la propiedad IncludeStrings, cambiala a False y ya no los verás.

Salud OS

djemix 26-10-2007 22:02:06

Si eso lo he entendido muy bien.... pero el problema es cuando el caracter ETX esta dentro de la cadena DATOS... no se si me explico...

La cosa es que no puedo asegurar que el STX y el ETX sean unicos en la trama ya que se pueden repetir en su interior...

egostar 26-10-2007 22:04:29

Cita:

Empezado por djemix (Mensaje 241543)
Si eso lo he entendido muy bien.... pero el problema es cuando el caracter ETX esta dentro de la cadena DATOS... no se si me explico...

La cosa es que no puedo asegurar que el STX y el ETX sean unicos en la trama ya que se pueden repetir en su interior...

Creo que sería buenos que captures lo que te envia el dispositivo y lo muestres aquí, no veo otra manera de ayudarte.

Salud OS

BetoAlonso 15-11-2007 17:07:10

Saludos

Una consulta
alguno de uds. podria decirme en ke momento entra al "ApdComPort1TriggerAvail" estoy probando los ejemplos de ese componente, pero en ningun momento entra ahi.

gracias

djemix 16-11-2007 10:12:55

El trigger se dispara automaticamente cuando se recibe cualquier tipo de dato por el puerto com que esté configurado en el componente.

Si no recibes nada es por alguna razon:

- No tengas el cable bien puesto o bien soldado o que los hilos no coincidan.

- Que el que emita los datos no los esté emitiendo.

- Que alguno de los puertos series que entran en comunicacion estén rotos.

- O que el puerto com seleccionado no sea en el que está puesto el cable (esto suele ser lo mas comun).

Yo te recomiendo que uses el hiperterminal de windows para asegurarte de que entran datos.

Saludos

BetoAlonso 08-12-2007 13:48:46

Gracias por tus comentarios djemix

ahora el Datapacket me devuelve lo siguiente :

uuu11uu30u0vvvvvvvvvvvvvvvvvvvx.

pero yo solo kiero los datos numericos osea solo 11300.

como podria filtrarlos.

gracias


La franja horaria es GMT +2. Ahora son las 17:36:12.

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