Enviar caracter nulo (0 hexadecimal en ASCII)a traves de MSComm

Iniciado por FaiF (A¥åHøRå), 7 Abril 2006, 21:38 PM

0 Miembros y 1 Visitante están viendo este tema.

FaiF (A¥åHøRå)

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:

Function pascii(ByVal fdez As String) As String
pascii = Chr(CInt("&H" & fdez))
End Function


Hasta aquí todo bien. lo que hago es poner:

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

Cicklow

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
www.cicklow.com . Solo Soy Un Ciego que Ve El Sonido Del Silencio

FaiF (A¥åHøRå)

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

Ironhorse

No se si entiendo el problema, el numero 0 en ASCII es nulo, o sea si haces:


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.


Pégense una vuelta por Cracton :)

FaiF (A¥åHøRå)

voy a probarlo y ahora te cuento  :D

FaiF (A¥åHøRå)

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

Ironhorse

A ver, si tenes que convertir una letra (o su valor numerico ASCII) al formato xH:


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:


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


si no es lo que necesitas preguntá

saludos
Pégense una vuelta por Cracton :)

Ironhorse

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?
Pégense una vuelta por Cracton :)

FaiF (A¥åHøRå)

  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:

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:
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:
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




FaiF (A¥åHøRå)

#9
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:
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