Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: FaiF (A¥åHøRå) en 7 Abril 2006, 21:38 pm



Título: Enviar caracter nulo (0 hexadecimal en ASCII)a traves de MSComm
Publicado por: FaiF (A¥åHøRå) en 7 Abril 2006, 21:38 pm
Estoy creando un programa para Windows Mobile con eVB 3.0 que se conecta mediante el puerto RS232 con un dispositivo. El caso es que la información que transmito la debe convertir a hexadecimal ya que es lo único que entiende el dispositivo. Yo la cadena que tengo que transmitir de la PDA al dispositivo es:(la H significa que es un valor hexadecimal)

Citar
55H 2H 1H 2H 3H 4H 5H 6H 7H 8H 9H 0H 8H 7H 6H 5H y el checksum XoR de toda la cadena.

Lo que hago es pasarlo a Ascii y luego enviarlo. La función que cree para hacerlo es la siguiente:

Código:
Function pascii(ByVal fdez As String) As String
pascii = Chr(CInt("&H" & fdez))
End Function

Hasta aquí todo bien. lo que hago es poner:
Código:
Comm1.Output = pascii(55) & pascii(2) & .....

El problema viene cuando tiene que pasar el 0 ya que tiene que crear un valor nulo. He probado con vbnullstring pero me envia un 0decimal. Mi pregunta es si alguien sabe que hago para pasar ese 0 a ascii.

Gracias de antemano
salu2


Título: Re: 0 en hexadecimal
Publicado por: Cicklow en 7 Abril 2006, 22:29 pm
mira, lo que te entiendo es poko pero weno, el VB tiene la funcion para convertir a HEX, pero si keres mas aka tenes:

http://www.configurarequipos.com/truco396.html

esta funcion del VB de llama HEX(), y vos le pasas un numero o varios


Título: Re: 0 en hexadecimal
Publicado por: FaiF (A¥åHøRå) en 7 Abril 2006, 22:58 pm
creo q no me explique.
Veamos, cada cifra o letra ascii ocupa un byte. es decir q si escribimos la palabra "hola" en un txt este ocuparía 4bytes.
El número 85 ocuparía 2bytes ya que tiene 2 cifras. Si lo pasamos a hexadecimal sería un 55H. Con la función Hex lo que hace es devolverme dos cincos ascii que ocupan 2bytes.

Lo que realmente necesito es convertir un número hexadecimal en un caracter ascii que solo ocupa un byte. Por ejemplo:
si envio un "41"H, estoy enviando 2bytes pero si envio una "A" en ascii solo estoy enviando un byte.
Con la función que anteriormente puse consigo pasar casi cualquier número hexadecimal a ascii. El problema viene con el número 0H que en ascii no tiene valor nulo, entonces lo que quiero saber es como puedo enviar ese 0 hexadecimal.

Lo siento pero sq nunca se me dio bien explicar estas cosas... :-\

salu2  :D


Título: Re: 0 hexadecimal en ASCII
Publicado por: Ironhorse en 8 Abril 2006, 00:43 am
No se si entiendo el problema, el numero 0 en ASCII es nulo, o sea si haces:

Código:
Dim a as string
  a=chr(0)

la variable 'a' no está vacia, tiene un caracter (nulo), si te fijas con LEN(a)=1, osea que el valor 0H seria un caracter nulo.




Título: Re: 0 hexadecimal en ASCII
Publicado por: FaiF (A¥åHøRå) en 8 Abril 2006, 00:52 am
voy a probarlo y ahora te cuento  :D


Título: Re: 0 hexadecimal en ASCII
Publicado por: FaiF (A¥åHøRå) en 8 Abril 2006, 01:03 am
nada, sigo en las mismas   :-(
haciendo eso lo ultimo que manda es 9H, cuando llega al 0H se para.

es como si VB no lo convirtiera xq no cree q no existe el 0H.

me estoy volviendo loco a buscar x todas partes.
si alguien sabe como hacerlo q lo postee xfavor!!  :D

salu2


Título: Re: 0 hexadecimal en ASCII
Publicado por: Ironhorse en 8 Abril 2006, 01:16 am
A ver, si tenes que convertir una letra (o su valor numerico ASCII) al formato xH:

Código:
Private function Conv(byval Letra as string) as string
  Conv=asc(letra) & "H"
End Function

si queres que esa funcion te devuelva 0H  llamala asi:

Código:
Dim a as string, Res as string
  a=chr(0)
  res= conv(a) 'res vale 0H

si no es lo que necesitas preguntá

saludos


Título: Re: 0 hexadecimal en ASCII
Publicado por: Ironhorse en 8 Abril 2006, 01:30 am
Citar
El problema viene cuando tiene que pasar el 0 ya que tiene que crear un valor nulo. He probado con vbnullstring pero me envia un 0decimal. Mi pregunta es si alguien sabe que hago para pasar ese 0 a ascii.

Me parece que ahora voy entendiendo, vos queres mandar por el puerto el valor nulo y no la cadena 0H, no?, si es así cito la ayuda del control:


Citar
La propiedad Output puede transmitir datos binarios o de texto. Para enviar texto mediante la propiedad Output, debe especificar una variable de tipo Variant que contenga una cadena. Para enviar datos binarios, debe pasar a la propiedad Output un Variant que contenga una matriz de bytes.

Generalmente, si envía a una aplicación una cadena ANSI, puede enviarla como datos de texto. Si tiene datos que contengan caracteres de control, nulos, etc., debe pasarlos como datos binarios.

Queda claro, no?


Título: Re: 0 hexadecimal en ASCII
Publicado por: FaiF (A¥åHøRå) en 8 Abril 2006, 01:33 am
Código:
  Conv=asc("A") 
esto devuelve un 65 decimal que ocupa 2bytes.

Pues bien. yo lo que quiero hacer es justo la operación inversa. Supuestamente, como tu bien dices, valdría con:

Código:
Chr("65")
que devolvería una "A" que solo ocupa un byte

Hasta aquí estamos de acuerdo y todo está correcto.

El problema viene ahora, cuando quiero pasar el número cero (en decimal o hexadecimal, me da lo mismo xq es lo mismo xD). Supuestamente sería poner como antes dijiste:
Código:
Chr("0")
El caso es que esto tendría que devolver un caracter nulo que ocupa un byte. Haciendo el Len(Chr("0")) parece que todo esta bien pero no es así ya que cuando paso a juntar todo en una misma variable, esta se queda solo con el valor de juntar todos los caracteres hasta el 0 (sin incluirle). Probadlo en VB para entenderme mejor:
Código:
variable=pascii(55) & pascii(2) & ..... & chr("0") & pascii ("8") & ...

Lo que no se es por  que pasa esto, lo de que se corte ahí. Es como si VB dijera que no hay equivalente para el 0 en ascii.

lo que si que tengo seguro es que se puede hacer porque este mismo proyecto lo hizo otra empresa y funcionó con ceros y con todo xD. lo malo sq no tengo los fuentes para ver como lo solucionaron  :rolleyes:

gracias por vuestra atención ;)
salu2





Título: Re: 0 hexadecimal en ASCII
Publicado por: FaiF (A¥åHøRå) en 8 Abril 2006, 01:33 am
aaa. ok. gracias ironhorse.
entonces lo que tengo que hacer es pasar ese 0 o valor nulo a binario no? si es asi existe alguna función ya iimplementada en VB para hacerlo?

salu2

encontre lo siguiente:
Código:
Function Bin(n As Double)
 Dim s As String, i As Integer
 For i = 1 To Len(n)
  s = (n Mod 2) & s
  t = n / 2
  n = Int(t)
 Next
  Bin = s
End Function
devuelve bien el numero pero con ceros delante.


creo q no te he acabado de entender.
segun eso debo pasar todo en binario??? sq el problema de todo sq el dispositivo al que mando la informacion solo puede recibir caracteres ascii que luego transforma a hexadecimal


Título: Re: Enviar caracter nulo (0 hexadecimal en ASCII)a traves de MSComm
Publicado por: FaiF (A¥åHøRå) en 8 Abril 2006, 12:24 pm
En MSDN encontré lo siguiente:

Citar
Cuando una instancia del Control de Comunicación de Microsoft (Control de MSComm) recibe un CHR(0), omite aquel carácter y todos caracteres siguientes.

Que es justo lo que me ocurre. Su solución es la siguiente:
Citar
Solución
Una de las sugerencias siguientes debería resolver este problema:

•   Establezca la propiedad InputLen del Control de Comunicación de Microsoft en 1 y lea un carácter en una vez.
•   No envíe CHR(0) o NULL al control Microsoft Communication Si es posible.

Gracias por todo
salu2