Entender el puerto serie

10/10/2006 - 23:39 por JJMurdoc | Informe spam
Estoy intentando hacer un programa que controla una central digital para
maquetas de trenes que se conecta a traves del COM6 con el PC.
Mi problema es que no se interpretar lo que leo del objeto SerialPort. Leo
el puerto cuando BytesToRead > 0 y uso ReadByte, pero lo que leo esta el
decimal, hexadecimal, ... vamos que no me aclaro.
Alguien puede orientarme un poco para que vaya aprendiendo.
Muchas gracias...,

Preguntas similare

Leer las respuestas

#1 Pep
11/10/2006 - 09:19 | Informe spam
Hola Murdoc,
En tu caso, el fabricante de la central digital, debe facilitarte la
información con el formato de las tramas a intercambiar... o sea es una
especie de protocolo, que formaliza las operaciones que puedes realizar.
Normalmente las tramas empiezan con un caracter concreto y acostumbran a
finalizar con 'Cr' que es el caracter 13.. en basic 'Chr(13)'.
Lo que se acostumbra es leer la trama completa y posteriormente procesarla.
Por ejemplo, imaginemos que el tercer caracter de la trama recibida indica
con un valor la situacion de la estacion codificando diferentes valores... a
saber (30= ok, 31=Parado, 32=marcha.. etc representando el valor del caracter
en ASCII, Entonces nuestro programa debera leerlos como sigue
Dim trama as string = readbytes...
'leer el valor ascii del tercer caracter (1ra posicion=0)
Select case Asc(trama.Substring(2,1))
case 30
case 31
case 32
End Select

Como te digo lo principal es obtener las instrucciones del fabricante y ver
como esta codificando la informacion.
Ya me diras algo,
Pep Lluis,

[MVP] Visual Developer - Visual Basic


"JJMurdoc" wrote:

Estoy intentando hacer un programa que controla una central digital para
maquetas de trenes que se conecta a traves del COM6 con el PC.
Mi problema es que no se interpretar lo que leo del objeto SerialPort. Leo
el puerto cuando BytesToRead > 0 y uso ReadByte, pero lo que leo esta el
decimal, hexadecimal, ... vamos que no me aclaro.
Alguien puede orientarme un poco para que vaya aprendiendo.
Muchas gracias...,
Respuesta Responder a este mensaje
#2 JJMurdoc
11/10/2006 - 12:57 | Informe spam
Gracias por tu interes. El tema es como dices, y tengo las especificaciones
del protocolo XpresNet que es el que se utilizan estas centrales digitales
(si me das un correo, te envio un PDF para que lo veas, si no es molestia).
El problema es que no entiendo como debo interpretar los datos del buffer
del puerto COM y como prepararlos para enviarlos. Creo que el problema radica
en que no se como estan los datos en ese buffer (ascii, hexadecimal, decimal,
bytes, etc...).
Si me ayudas, te lo agrdezco, porque es un proyecto muy interesante pero que
esta parado.
Dime algo. Gracias...

"Pep" wrote:

Hola Murdoc,
En tu caso, el fabricante de la central digital, debe facilitarte la
información con el formato de las tramas a intercambiar... o sea es una
especie de protocolo, que formaliza las operaciones que puedes realizar.
Normalmente las tramas empiezan con un caracter concreto y acostumbran a
finalizar con 'Cr' que es el caracter 13.. en basic 'Chr(13)'.
Lo que se acostumbra es leer la trama completa y posteriormente procesarla.
Por ejemplo, imaginemos que el tercer caracter de la trama recibida indica
con un valor la situacion de la estacion codificando diferentes valores... a
saber (30= ok, 31=Parado, 32=marcha.. etc representando el valor del caracter
en ASCII, Entonces nuestro programa debera leerlos como sigue
Dim trama as string = readbytes...
'leer el valor ascii del tercer caracter (1ra posicion=0)
Select case Asc(trama.Substring(2,1))
case 30
case 31
case 32
End Select

Como te digo lo principal es obtener las instrucciones del fabricante y ver
como esta codificando la informacion.
Ya me diras algo,
Pep Lluis,

[MVP] Visual Developer - Visual Basic


"JJMurdoc" wrote:

> Estoy intentando hacer un programa que controla una central digital para
> maquetas de trenes que se conecta a traves del COM6 con el PC.
> Mi problema es que no se interpretar lo que leo del objeto SerialPort. Leo
> el puerto cuando BytesToRead > 0 y uso ReadByte, pero lo que leo esta el
> decimal, hexadecimal, ... vamos que no me aclaro.
> Alguien puede orientarme un poco para que vaya aprendiendo.
> Muchas gracias...,
Respuesta Responder a este mensaje
#3 JJMurdoc
11/10/2006 - 13:13 | Informe spam
Para aclararte la información, te envio, al final del mensaje, parte del
manual del protocolo con la información de un caso concreto. En este caso,
cuando en la central digital se pulsa STOP, se envia a todas las locomotoras
y al interface con el PC la información que se indica, para que se detenga
todo el sistema. Cuando hago esto, el buffer del puerto COM6 se llena de
datos, pero cuando los leo, no se parecen en nada a lo que veo en el manual.
Ahora no recuerdo exactamente los valores, pero la propiedad BytesToRead del
objeto SerialPort se pone a 25, y cuando ejecuto un bucle que lee con
ReadByte recoje un número y rebaja el valor de BytesToRead hasta que
BytesToRead = 0. Al terminar, tengo una secuencia de 25 números que no se
interpretar. Es una secuencia que se repite 4 o 5 veces (no recuerdo) en los
25 números. Algo así como 255 253 96 0 97 255 253 96 0 97 255 253 96 0 97...
(ya te anticipo que no es lo que en el manual se indica en la linea Decimal:
96 129 0 129)
Espero que lo entiendas y me puedas echar una mano.
Gracias...
-
2.1.4.3 Emergency Stop
Format:
Call Byte Header byte Data Byte 1 X-Or-byte
Binary: P110 0000 1000 0001 0000 0000 0110 0001
Hex: 0x60 0x81 0x00 0x81
Decimal: 96 129 0 129
Description:
The command station is in emergency stop mode and has sent emergency stop
commands to all locomotives on the track by means of a DCC Broadcast Stop
command. The track power remains on, so that turnout control commands can
continue to be sent, however no further locomotive commands will be
sent to the layout, until the command station is instructed to restart the
layout.
Comments:
This call is received without an inquiry by the XpressNet equipment. It is
an unrequested transmission
that must be handled.
-
Respuesta Responder a este mensaje
#4 Pep
11/10/2006 - 16:14 | Informe spam
Ok,
En principio no vamos a necesitar el manual, en todo caso te lo pedire mas
adelante.
A simple vista es muy simple, primero debes corregir los parametros de
conexion del serialport para que coincidan con los de la Central (Velocidad,
paridad, bits de stop) por lo que se aprecia en la trama recibida esta mal
ajustado... ¡ no coinciden !. Si te parece puedes mandarme el apartado del
manual que habla de eso y te ayudo con los parametros del constructor del
puerto serie.
Una vez solucionado esto, cuando pulses la emergencia BytesToRead pasara a
tener un valor de 4... no se si periodicamente y de una manera temporizada la
central manda esta secuencia. Si es asi el BytesToRead ira inclementando cada
periodo de tiempo... pero eso no sera problema, pues bastara con aislarlos en
grupos de 4.
Tal como indica la informacion que me adjuntas, el primer Byte es la
cabecera: asi siempre que recibimos un 0x60 significa que el siguiente es una
cabecera, a continuacion un byte de datos y por ultimo el checksum (x-or
Byte) que sirve para descartar errores en la transmision.
En este caso entiendo que una cabecera x081 significa "paro de emergencia".
Quando recibas los 4 bytes es tan sencillo como :
Dim trama as string = readbytes...
if Asc(trama.Substring(2,1)) then messagebox.show("Atencion Parada de
Emergencia")
Lamento escribirte tan desordenado, pero no dispongo de mas tiempo. Si te
parece que puedo continuar ayudandote, tambien puedes encontrarme :
http://forums.microsoft.com/ busca Peplluis.
Saludos,

[MVP] Visual Developer - Visual Basic


"JJMurdoc" wrote:

Para aclararte la información, te envio, al final del mensaje, parte del
manual del protocolo con la información de un caso concreto. En este caso,
cuando en la central digital se pulsa STOP, se envia a todas las locomotoras
y al interface con el PC la información que se indica, para que se detenga
todo el sistema. Cuando hago esto, el buffer del puerto COM6 se llena de
datos, pero cuando los leo, no se parecen en nada a lo que veo en el manual.
Ahora no recuerdo exactamente los valores, pero la propiedad BytesToRead del
objeto SerialPort se pone a 25, y cuando ejecuto un bucle que lee con
ReadByte recoje un número y rebaja el valor de BytesToRead hasta que
BytesToRead = 0. Al terminar, tengo una secuencia de 25 números que no se
interpretar. Es una secuencia que se repite 4 o 5 veces (no recuerdo) en los
25 números. Algo así como 255 253 96 0 97 255 253 96 0 97 255 253 96 0 97...
(ya te anticipo que no es lo que en el manual se indica en la linea Decimal:
96 129 0 129)
Espero que lo entiendas y me puedas echar una mano.
Gracias...
-
2.1.4.3 Emergency Stop
Format:
Call Byte Header byte Data Byte 1 X-Or-byte
Binary: P110 0000 1000 0001 0000 0000 0110 0001
Hex: 0x60 0x81 0x00 0x81
Decimal: 96 129 0 129
Description:
The command station is in emergency stop mode and has sent emergency stop
commands to all locomotives on the track by means of a DCC Broadcast Stop
command. The track power remains on, so that turnout control commands can
continue to be sent, however no further locomotive commands will be
sent to the layout, until the command station is instructed to restart the
layout.
Comments:
This call is received without an inquiry by the XpressNet equipment. It is
an unrequested transmission
that must be handled.
-
Respuesta Responder a este mensaje
#5 Pep
11/10/2006 - 16:34 | Informe spam
Disculpa!! las prisas no son buenas... 0x81 en hex es igual a 129 decimal,
quizas la mejor manera seria :

Dim trama as string = readbytes...
if asc(trama.Substring(0,1))– then
if asc(trama.Substring(1,1))9
messagebox.show("Atencion Parada de ..")
end if
end if
o tambien en texto :
if trama.Substring(0,2)="`ü" then parada de emergencia

recuerda que el caracter 96 de un ` y el 129 una ü.
existen multitud de formas para convertir caracteres... si te insteresa las
repasamos.
Pep Lluis,
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida