Autor Tema: PROBLEMA RARÍSIMO CON RS-232  (Leído 5476 veces)

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

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
PROBLEMA RARÍSIMO CON RS-232
« en: 11 de Diciembre de 2007, 09:56:35 »
Hola a todos,

Os comento: Tengo que traducir un byte de una cadena de bytes que me llegan por RS-232. Concretamente es el byte 34 de la cadena y los valores que puede tomar son de 0 a 255 (en decimal) o bien de 0 a FF (en hexa). La cadena es del tipo:

0A F3 D1 45 etc... hasta 60 bytes.

Lo recibo con: InBuffer = MSComm1.Input y lo raro, rarísmo es que todo funciona para valores de 0 a 129 y de 160 a 255. Es decir que si me llega 0xDF lo recibo correcto y muestro en pantalla 223 pero si me llega 0x95 en pantalla me aparece 34 en lugar de 149.

Los datos que recibo los monitorizo con un programa para ver lo que entra/sale del puerto. Y el aparato que me envía la información tiene una pantalla donde veo perfectamente los valores que manda, por lo que no hay error posible ahí.

Para mostrar el dato utilizo lo siguiente:

Label2.Caption = "Valor real= " & InBuffer(34) & "Valor Hexa= " & Hex(InBuffer(34))

La parte que me muetsra el hexa, por supuesto, también la muestra mal: muestra el hexa del valor decimal erróneo. No entiendo de dónde saca esos valores porque, como digo, en el programa moitor del puerto veo el byte perfectamente y si algo estuviese mal no funcionaría para el resto de valores fuera del rango malo.

Se os ocurre algo?

Gracias y un saludo!!

 

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: PROBLEMA RARÍSIMO CON RS-232
« Respuesta #1 en: 11 de Diciembre de 2007, 10:00:04 »
He olvidado comentar que InBuffer está declarado así:

Dim InBuffer() As Byte

Un saludo!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: PROBLEMA RARÍSIMO CON RS-232
« Respuesta #2 en: 11 de Diciembre de 2007, 11:13:16 »
Hola

Label2.caption solo puede trabajar con valores ASCII imprimibles en pantalla, talvez el rango que mencionas no es imprimible. Intenta copiar el byte 34 de forma numérica a una variable integer, no lo muestres como caracter. Una vez teniéndolo en la integer imprímelo usando Val(numero).

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: PROBLEMA RARÍSIMO CON RS-232
« Respuesta #3 en: 11 de Diciembre de 2007, 11:53:06 »
He olvidado comentar que InBuffer está declarado así:

Dim InBuffer() As Byte

Un saludo!

Así se declara un arreglo adimensional.

Entonces, luego seguro lo redimensionarás. Mostranos tu código para ver cómo lo haces.

No mencionaste nada acerca de la configuración que usas del RS 232. Baudios? RThresHold? etc,etc...

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: PROBLEMA RARÍSIMO CON RS-232
« Respuesta #4 en: 11 de Diciembre de 2007, 12:17:48 »
Hola,

El puerto está configurado como 19200,n,8,1, utilizo DTREnable y EOFEnable y no utilizo ni RTSEnable ni RThreshold. El buffer siempre lo leo entero (InpuLen=0) y el modo de entrada está como Texto.

El array no lo redimensiono de forma específica. Después de declararlo como byte lo utilizo directamente para meter dentro lo que me devuelve MSComm1.Input. Al estar declarado como byte en cada elemento tendré un byte recibido y por eso me voy hasta el 34 y directamente lo trato como valor decimal:

Label2.Caption = "Valor real= " & InBuffer(34) & "Valor Hexa= " & Hex(InBuffer(34))
dato_leido=InBuffer(34)

'Retorno de la función devolviendo dato_leido

Y luego escribo dato_leido en un excell.

Como digo el problema es que sólo hace cosas raras con ese pequeño rango de valores. En teoría si me llega 0x95 (149decimal), por ejemplo, no debería dar problema, no?


« Última modificación: 11 de Diciembre de 2007, 12:20:52 por DarkVect »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: PROBLEMA RARÍSIMO CON RS-232
« Respuesta #5 en: 11 de Diciembre de 2007, 12:52:15 »
Bueno.

Voy a intentar diagnosticar el problema.

Vos estas igualando un array de Bytes a una cadena de caracteres(string):

InBuffer = MSComm1.Input

El VB te acomoda los valores, pero lo que vos no estas viendo es que por mas que parezca una conversion fácil, el VB no convierte directamente un caracter en un byte. Como vos no exigís una conversión explícita(casting), el VB hace una conversión implícita.

Veamos...

Dentro del buffer de entrada tenés caracteres(porque así lo configuraste). Si bien un caracter ASCII es un byte, un caracter ASCII es un poco más que un byte: Es un byte con su valor asociado a una tabla ASCII. Y aquí es donde me parece que debe estar la respuesta a tu problema.

El VB6 no tiene los mísmos valores para todos los caracteres que la tabla ASCII standart.
Es decir, que el valor 149 representa un símbolo en VB que no es el mísmo que representa en la tabla de caracteres ASCII internacionalmente aceptada.

Entonces, me parece que el VB está malinterpretando dichos caracteres.

Probá haciendo así:

Dim InBufferT As String
Dim InBuffer() As Byte

InBufferT = MsComm1.Input

ReDim InBuffer(Len(InBufferT))
For i = 1 To Len(InBufferT)
    InBuffer(i) = Asc(Mid(InBufferT, i, 1))
Next

Label2.Caption = "Valor real= " & InBuffer(34) & "Valor Hexa= " & Hex(InBuffer(34))
dato_leido=InBuffer(34)

Por ahí lo solucionás así. Pero para mi viene por el lado de las discrepancias entre las tablas de caracteres ASCII y dejarle demasiado control al VB sobre las conversiones entre tipos de variables.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: PROBLEMA RARÍSIMO CON RS-232
« Respuesta #6 en: 11 de Diciembre de 2007, 14:08:37 »
Amigo BrunoF es usted un MAESTRO, con todas las letras y en mayúscula!!!

La cosa ha funciona salvo una pequeña corrección que he añadido. Resulta que si mostraba InBuffer(34) el valor no se correspondía con el correcto sino con el que tengo varios bytes más adelante. Supongo que la conversión que me ha dado va cogiendo bytes de forma que cada combinación de entrada oxNN se convierte en un solo valor, por lo que el byte en lugar de ser el 34 ahora es el 18.

Me puede explicar qué es lo que hace la mini-rutina que me ha dado?

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: PROBLEMA RARÍSIMO CON RS-232
« Respuesta #7 en: 11 de Diciembre de 2007, 14:12:39 »
Sólo una cosa más. Ahora en el Label2 veo el valor correcto que me marca el dispositivo y que observo que entra pr el puerto por el monitor del serie, pero NO puedo asignárselo a dato_leido!! Siempre me asigna un 0 ¿?

El código es el que me ha pasado, exactamente igual.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: PROBLEMA RARÍSIMO CON RS-232
« Respuesta #8 en: 11 de Diciembre de 2007, 14:22:28 »
Hola!

Me alegra haber podido ayudarte.

Bueno, la rutina lo que hace es evitar que el VB haga conversiones implicitas de manera tal que corrompa los bytes recibidos o los malinterprete debido a sus diferencias de tabla ASCII.

Intento explicarte brevemente linea por linea:

Dim InBufferT As String 'Declaro una variable donde almacenare temporalmente los datos recibidos del MSComm

Dim InBuffer() As Byte 'Declaro un array de bytes que es donde se almacenaran los bytes recibidos finalmente.

InBufferT = MsComm1.Input    'Copio(y libero) el contenido del buffer de entrada del MSComm

ReDim InBuffer(Len(InBufferT))   'Redimensiono mi array de bytes segun la cantidad de caracteres que posee InBufferT
For i = 1 To Len(InBufferT)          'Recorro cada caracter de InBufferT
    InBuffer(i) = Asc(Mid(InBufferT, i, 1))   'Y hago un casting, exigiendo que me pase cada valor ASCII a decimal segun su propia tabla de caracteres.
Next



¿Que tipo de dato es dato_leido?

Asegurate que el array tenga elemento 34! por ahi esta fuera del intervalo el 34...

lbound(InBuffer) te devuelve el valor del indice bajo del arreglo
ubound(InBuffer) te devuelve el valor del indice alto del arreglo

Usalos para saber cuáles son los límites actuales del array.

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: PROBLEMA RARÍSIMO CON RS-232
« Respuesta #9 en: 11 de Diciembre de 2007, 14:22:50 »
Solucionado!! Era un problema al asignar los bytes para calcular el valor.

De nuevo, muchísimas gracias!!


 

anything