Leer Parte De La Respuesta Del Puerto Serie


Objetivo: Leer Parte De La Respuesta Del Puerto Serie
Hola.
Estoy intentando leer una parte de la cadena que recibo del puerto serie.
Para ello, hago una petición al puerto serie y con MID$, quiero mostrar parte de la respuesta.
El código es:
PUBLIC SUB Button5_Click()
DIM s AS String
PRINT #Sport, Chr$(2) & "TW?" & Chr$(13)
READ #Sport, s, Lof(Sport)
TextBox2.Text = Mid$(s, 6,4)
TextArea1.Text = TextArea1.Text & s
END

El puerto serie me contesta, correctamente, ya que el TextArea1, se muestra la respuesta.
Pero la parte de final de la cadena, no me la muestra en el TextBox2.
En la respuesta, el primer carácter es el código Chr$(2) -> A,?,214A,W

¿en que me equivoco?
Saludos.

Perfil MP  
Objetivo: Re: Leer Parte De La Respuesta Del Puerto Serie
vamos a ver ...

Primero que veo que haces esto
TextArea1.Text = TextArea1.Text & s

Cuando también puedes hacer esto
TextArea1.text &= s


Ahora lo segundo.

Tu primero envías a #Sport un determinado string y esperas una respuesta ¿es eso? La respuesta es lo que lees inmediatemente detŕas con el read ¿no es así? Porque si es así está mal pero no me meto mas en ello porque no estoy seguro que sea eso.

Lo tercero es que si lees una secuencia de bits digamos 1 0 0 1 tu no puedes meter eso así como así en un textbox. Lo que estarías intentando meter es el ascii 1 mas el ascii 0 mas el ascii 0 mas el ascii 1 y luego quizá te sorprendas que lo que lees en el textbox no parece ser correcto. Tampoco estoy nada seguro si te estoy interpretando bien pero lo que es seguro es que no se pueden meter valores binarios así como así en un textbox. Ese 1 tendrías que pasarlo a su valor ascii y la forma mas simple de hacerlo es a cada elemento sumarle el ASCII de 0 y completar el text con ese valor. Por último ten cuidado con las transformaciones porque el string binario 1001 tiene el valor decimal 9, pero si haces un cint o un clong o algo así (por ejemplo para usar la función hex) lo que vas a obtener no es un 9 sino un 1001.

Espero tu respuesta para poder explicarme con mas claridad.

última edición por soplo el Miercoles, 27 Julio 2011, 03:23; editado 1 vez
Perfil MP  
Objetivo: Re: Leer Parte De La Respuesta Del Puerto Serie
Lo que pasa es que el caracter 0x02 no es imprimible. Lo que te recomiendo es que pongas su representación numérica en decimal o hexadecimal (usa las funciones Asc() y Hex$() ).
Y sigue también las recomendaciones de soplo.

Saludos!

Objetivo: Re: Leer Parte De La Respuesta Del Puerto Serie
Hola Soplo.
Gracias por tu respuesta.
Ya he cambiado la linea que me indicas.
Estoy intentando gobernar un carro de una maquina. Este maquina, responde a las preguntas que se le hace, y cuando se mueve el carro que tiene, indica en cada momento, la posición que va tomando.
Con la orden, le interrogo en que posición esta
PRINT #Sport, Chr$(2) & "TW?" & Chr$(13)



Con la orden
TextArea1.Text &= s

Ella me responde con la siguiente linea.
A,?,214A,W
el formato de la respuesta es el código Chr$(2) seguido de "A,?,214,W"
Los tres dígitos, es este ejemplo 214, es la posición en la que esta, y "W" que es una lectura fija

Mi problema es que quiero leer los dos últimos valores (en este caso 214,W)
Puse un TextBox, para mostrar que funcionaba, lo que me interesa es el valor, para sino mandar una orden y posicionarlo en el punto exacto.

Si pongo
LINE INPUT #Sport

Me da un mensaje de erro diciendo que el fichero ha llegado al final.
He intentado solucionarlo con:
PUBLIC SUB Button8_Click()
DIM UnaLinea AS String
PRINT #Sport, Chr$(2) & "A?" & Chr$(13)
WHILE NOT Eof(Sport)
LINE INPUT #Sport, UnaLinea
PRINT UnaLinea
WEND
TextBox3.Text = UnaLinea
END

No da error, pero no me aparece en el TextBox.
He utilizado cint o un clong, pero me da erro de que espera un tipo pero recibo otro.
¿Como debería de hacerlo?

Un cordial saludo.
Manuel

Perfil MP  
Objetivo: Re: Leer Parte De La Respuesta Del Puerto Serie
Hola,
He conseguido algo.
Con el siguiente código:
PUBLIC SUB Button9_Click() 'Opcion INPUT Line
DIM Datos_Serie AS String
DIM LineaDatos AS String[]
IF Sport.Status = Net.Active THEN
PRINT #Sport, Chr$(2) & "TW?" & Chr$(13)
WHILE NOT Eof(Sport)
LINE INPUT #Sport, Datos_Serie
LineaDatos = Split(Datos_Serie, ",") ' como los datos están separados por comas
WEND
ENDIF
IF Len(Datos_Serie) > 0 THEN ' puesto para que no salga el error "Null Object"
label4.Text = LineaDatos[2]
label3.Text = LineaDatos[3]
ENDIF
Datos_Serie = ""
END

Funciona, ahora
LineDatos[3], muestra la letra de que la medida es estable
LineDatos[2], muestra el valor de la posición.

Pero:
Cuando le doy un click no me da ningún valor, tengo que darle dos veces al botón para que me muestre el valor.
Por eso le he puesto el
IF Len(Datos_Serie) > 0 THEN ' puesto para que no salga el error "Null Object"

para evitar el error
¿alguna idea?
Saludos y gracias.
Manuel.

Perfil MP  
Objetivo: Re: Leer Parte De La Respuesta Del Puerto Serie
Citar:
Pero:
Cuando le doy un click no me da ningún valor, tengo que darle dos veces al botón para que me muestre el valor.


Yo creo que es porque la primera vez que preguntas "IF Sport.Status = Net.Active" es falso. No estoy seguro.

Yo usaría el evento _Read() del puerto serie para leer el buffer de datos del puerto serie, en lugar de hacerlo mediante un botón, y dejaría para dicho botón el envío manual de las órdenes hacia el dispositivo, es decir, la escritura. El evento Read se dispara siempre que haya datos pendientes de leer en el puerto, sólo tienes que trasladar la parte de tu código que se encarga de leerlo.

Si el puerto serie lo has creado desde el IDE de gambas, ya estarán declarados su manejadores de eventos, pero si lo has creado por código deberás hacerlo manualmente de esta forma:

Public Sport as new SerialPort as "Sport"


Y luego declarar el manejador:

Public Sub Sport_Read()

' código aquí

End


Saludos

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.4332s (PHP: -74% SQL: 174%)
Consultas SQL: 45 - Debug off - GZIP Activado