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

#6 JJMurdoc
11/10/2006 - 20:20 | Informe spam
Abusando un poco de tu ayuda, te paso algunos datos.
El interface y el protocolo parece que funcionan con 57600 baud, 8 data
bits, 1 start bit, 1 stop bit y no parity bit. Si no me equivoco, esto lo
debo de configurar en el objeto SerialPort. En esto creo que estoy en lo
cierto.
Esta noche o mana pruebo el sistema con tus aclaraciones y te envio datos
reales de lo que leo y si me aclaro.
Muchas gracias por tu interes. Saludos...
Respuesta Responder a este mensaje
#7 JJMurdoc
12/10/2006 - 00:16 | Informe spam
Ya he probado el sistema. Te paso el cdigo completo del programa que he
diseado para que lo revises, y los resultados que se muestran en un listbox.
Hay dos prueba y dos resultados, con y sin la funcin ASC que tu proponias. No
estoy contento, porque no veo por donde meterle mano. Los resultados son tras
pulsar la tecla STOP en la central digital, como te mostre en el mensaje
anterior.
Ahi va el cdigo y los resultados. Espero que tengas algo de tiempo para
ayudarme. Gracias anticipadas. Saludos...

El cdigo

Public Class frmPrincipal
Dim objPuertoSerie As New System.IO.Ports.SerialPort

Private Sub frmPrincipal_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
'Carga el objeto SerialPort
Me.objPuertoSerie.PortName = "COM7"
Me.objPuertoSerie.BaudRate = 57600
Me.objPuertoSerie.Parity = IO.Ports.Parity.None
Me.objPuertoSerie.DataBits = 8
Me.objPuertoSerie.StopBits = IO.Ports.StopBits.One

'Inicia el temporizador
Me.objReloj.Enabled = True
End Sub

Private Sub objReloj_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles objReloj.Tick
'Declaracin de variables
Dim strCadena As String = ""

'Comprueba si el puerto esta abierto
Select Case Me.objPuertoSerie.IsOpen
Case True
Me.labConexionEstado.Text = "Conectado"
Me.labBytes.Text = Me.objPuertoSerie.BytesToRead
If Me.objPuertoSerie.BytesToRead > 0 Then
Me.lbxDatos.Items.Add(Me.objPuertoSerie.ReadByte)
End If
Case False
Me.labConexionEstado.Text = "Desconectado"
Me.labBytes.Text = 0
Me.lbxDatos.Items.Clear()
End Select
End Sub

Private Sub botConectar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles botConectar.Click
'Abre/Cierra la conexin con el puerto serie
Select Case Me.objPuertoSerie.IsOpen
Case True
Me.objPuertoSerie.Close()
Me.botConectar.Text = "Conectar"
Case False
Me.objPuertoSerie.Open()
Me.botConectar.Text = "Desconectar"
End Select
End Sub

Private Sub botBorrarLista_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles botBorrarLista.Click
'Limpia la lista
Me.lbxDatos.Items.Clear()
End Sub
End Class

y los resultados

255
253
97
0
97
255
253
97
0
97
255
253
97
0
97
255
253
97
0
97
255
253
97
0
97

el cdigo modificado


Me.lbxDatos.Items.Add(Asc(Me.objPuertoSerie.ReadByte))

y los nuevos resultados


50
50
57
48
57
50
50
57
48
57
50
50
57
48
57
50
50
57
48
57
50
50
57
48
57
Respuesta Responder a este mensaje
#8 Pep
16/10/2006 - 16:41 | Informe spam
Hola JJ,
Lamento no tener mas disponibilidad... pero con calma seguro que lo
resolvemos.
De entrada, como te dije en el anterior mensaje, debes verificar y ajustar
los parametros de puerto a los valores de la consola... me extraña mucho que
trabaje a 57600!! normalmente este tipo de dispositivos trabajan como mucho a
19200, si bien no es nada raro verlos trabajar a partir 2400.
Tenemos que conseguir recibir solo 4 Bytes correspondiendo a los codigos que
define el manual, y por la cantidad que estas recibiendo pareceria que la
velocidad correcta es 9600.
De nuevo si puedes verifica los parametros de conexion.
Si vemos que la cosa se complica, miramos de pasarnos correos para que nos
podamos comunicar mas fluidamente.
Saludos,
Pep Lluis,

[MVP] Visual Developer - Visual Basic


"JJMurdoc" wrote:

Ya he probado el sistema. Te paso el cdigo completo del programa que he
diseado para que lo revises, y los resultados que se muestran en un listbox.
Hay dos prueba y dos resultados, con y sin la funcin ASC que tu proponias. No
estoy contento, porque no veo por donde meterle mano. Los resultados son tras
pulsar la tecla STOP en la central digital, como te mostre en el mensaje
anterior.
Ahi va el cdigo y los resultados. Espero que tengas algo de tiempo para
ayudarme. Gracias anticipadas. Saludos...

El cdigo

Public Class frmPrincipal
Dim objPuertoSerie As New System.IO.Ports.SerialPort

Private Sub frmPrincipal_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
'Carga el objeto SerialPort
Me.objPuertoSerie.PortName = "COM7"
Me.objPuertoSerie.BaudRate = 57600
Me.objPuertoSerie.Parity = IO.Ports.Parity.None
Me.objPuertoSerie.DataBits = 8
Me.objPuertoSerie.StopBits = IO.Ports.StopBits.One

'Inicia el temporizador
Me.objReloj.Enabled = True
End Sub

Private Sub objReloj_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles objReloj.Tick
'Declaracin de variables
Dim strCadena As String = ""

'Comprueba si el puerto esta abierto
Select Case Me.objPuertoSerie.IsOpen
Case True
Me.labConexionEstado.Text = "Conectado"
Me.labBytes.Text = Me.objPuertoSerie.BytesToRead
If Me.objPuertoSerie.BytesToRead > 0 Then
Me.lbxDatos.Items.Add(Me.objPuertoSerie.ReadByte)
End If
Case False
Me.labConexionEstado.Text = "Desconectado"
Me.labBytes.Text = 0
Me.lbxDatos.Items.Clear()
End Select
End Sub

Private Sub botConectar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles botConectar.Click
'Abre/Cierra la conexin con el puerto serie
Select Case Me.objPuertoSerie.IsOpen
Case True
Me.objPuertoSerie.Close()
Me.botConectar.Text = "Conectar"
Case False
Me.objPuertoSerie.Open()
Me.botConectar.Text = "Desconectar"
End Select
End Sub

Private Sub botBorrarLista_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles botBorrarLista.Click
'Limpia la lista
Me.lbxDatos.Items.Clear()
End Sub
End Class

y los resultados

255
253
97
0
97
255
253
97
0
97
255
253
97
0
97
255
253
97
0
97
255
253
97
0
97

el cdigo modificado


Me.lbxDatos.Items.Add(Asc(Me.objPuertoSerie.ReadByte))

y los nuevos resultados


50
50
57
48
57
50
50
57
48
57
50
50
57
48
57
50
50
57
48
57
50
50
57
48
57

Respuesta Responder a este mensaje
#9 JJMurdoc
16/10/2006 - 21:26 | Informe spam
Al contrario, gracias por tu paciencia. He buscado por ahi y pareces mi nica
esperanza, asi que voy a abusar un poco de tu paciencia.
Yo preferiria usar el correo privado, pero me sabe mal por el foro, aunque
luego podemos publicar los resultados, una vez funcione todo, que creo que
entre los dos funcionar. Te mando mi correo por si no quieres publicar el
tuyo. Enviame uno, estamos en contacto y. te envio los manuales que tengo,
para ver si ves claridad al tema. Probar el tema que me comentas del tipo de
conexin.
Mi correo es Lo leo continuamente, asi que estoy a tu
disposicin.
Espero tus noticias...
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida