Principales respuestas
como esperar una respuesta deseada del puerto serie

Pregunta
-
hola amigos
sigo rompiendome la cabeza con el puerto serie , tengo una pregunta
envio al dispositivio a traves del puerto serie una orden para que este se resetee , y quiero leer solo el puerto serie cuando el dispositivo responde que ok , que se ha reseteado
codigo
Port1.Write("2F 50 50 03" & vbLf & vbCr)
dato = ""
dato = Port1.ReadTo(">")esplicacion de lo que tengo que hacer :
2f 505003 es la orden de reset al dispositivo cuando leo de esta forma dato=port1.readto(">") , me devuelve 7f2f7f..>
que es un error no se ha heche el reset .
el dispositivo cuando se hace el reset devuelve 6f505003 .
habria alguna forma de esperar a que ese dato se de antes de leer , y en su defecto, si no hace el reset que halla un desbordamiento o mensage de error
un saludo chicos
Respuestas
-
hola a todos y gracias
solucionado
me habia comido un 20 en hex, es decir un espacio el del final , que no se ve como es logico .
se me ha ocurrido probar a la desesperada y pan , hecho
gracias a todos
solucionado
- Marcado como respuesta zocopeo domingo, 1 de abril de 2012 0:26
Todas las respuestas
-
-
Hola Zocopeo,
Existen varias dudas entorno a tu pregunta... la primera es : Para enviar hexadecimales, no puedes utilizar Port1.Write("2F 50 50 03"), en todo caso su expresion correcta seria :
Port1.Write(&h2f+&h50+&h50+&h3)
Luego para la recepcion te aconsejaria utilizar una expresion similar a :
Buffer = Port1.ReadExisting
If Buffer.IndexOf(&h6f+&h50+&h50+&h3)>0 then ... 'Reset recibido else ...'esperar al timeout e indicar que no se ha realizado el resetSi te parece vamos avanzando a medida que aclaramos dudas,
Saludos,
PepLluis,MVP - Visual Developer
-
hola PepLluis
no he contestado antes pues he estado enfermo
yo envio al puerto serie port1.write("2f 505003 " & vbcrlf)
ya que el dispositivo asi requiere el envio, si envio lo que tu me comentas me da error.
si yo le pongo
buffer = port1.readExisting
if buffer.indexOf(6f+50+50+03)>0 then
me da que el tiempo de espera se ha sobrepasado
la verdad es que no se como hacer esto, ya que el envio de esta orden es para resetear el dispositivo que esta en el serie y lo que se espera es una respuesta afirmaiva 6f 50 50 03 ó no afirmativo que entoces no envia un mensaje de error .
lo que yo quiero hacer es despues de un tiempo de espera si en el buffer esta este dato que es de 4 bytes lo trato como afirmativo y si no puede hacer el reset, que nos envia un error que es de 3bytes como or ejemplo 7f 33 01 lo ratariamos de otra manera .
no se puede hacer con otra orden diferente a readExisting o de alguna otra forma
muchas gracias
y perdona si me he equivocado al escribir este texto , todavia veo borroso
un saludo
-
hola
pongo un fragmento de datos lectura y escritura el el serie el fragmento de mas arriba no funcion da error 7F2F7F que es el mio
y el de mas abajo es el del fabricante que funciona correcto, responde 6F505003
este dispositivo trabaja directamente con hex sin necesidad de poner &
Private Sub BtAjusteSensor_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtAjusteSensorDelphy1.Click
Dim reset As String
Try
LbProcsoTerminado.Visible = True And LbProcsoTerminado.Text = dato
LbEspere.Visible = True
ProgreAjustes15s.Visible = True
TimerPrpgresbar.Start() ' pongo en marcha el relos progresbarPort1.Write("2F505003" & vbCrLf)
Thread.Sleep(20)
reset = Port1.ReadExisting
If reset.IndexOf("6f505003") > 0 Then
End If
If reset.Contains("7f") Then
MsgBox("err")
End If
'test
BtAjusteSensorDelphy1.Enabled = False
'If Port1.ReceivedBytesThreshold.CompareTo("6f505003") Then
Catch ex As Exception
ErrorConexion.Show()
End Try
End Suby siempre retorna msgbox ("err")
he intentado de varias maneras y siempre mismo resultado
Pedido:17/03/2012 9:34:21.08164 (+0.0040 seconds)
32 46 35 30 35 30 30 33 0D 0A 2F505003..
Respuesta:17/03/2012 9:34:21.10164 (+0.0200 seconds)
37 46 32 46 37 46 0D 0D 3E 7F2F7F..>
HHD Software Serial Monitor HTML ExportPedido:17/03/2012 9:37:59.56864 (+1.0831 seconds)
32 46 20 35 30 20 35 30 20 30 33 0A 0D 2F 50 50 03..
Respuesta:17/03/2012 9:37:59.59264 (+0.0110 seconds)
36 46 35 30 35 30 30 33 0D 0D 3E 6F505003..>
-
Hola:
¿Haz probado enviarlo en ASCII?
Private Sub button_b_Click(sender As Object, e As EventArgs) Dim mBuffer As Byte() = Encoding.ASCII.GetBytes("Hello World") serialPort1.Write(mBuffer, 0, mBuffer.Length) End Sub
Si te empeñas en hexadecimal, puedes hacerlo así también con tramas.
Private Sub button_t_Click(sender As Object, e As EventArgs) Dim mBuffer As Byte() = New Byte(4) {} mBuffer(0) = &H74 mBuffer(1) = &H75 mBuffer(2) = &H89 mBuffer(3) = &H20 mBuffer(4) = &H6c serialPort1.Write(mBuffer, 0, mBuffer.Length) End Sub
Por curiosidad.
¿Qué dispositivo es?
Un saludo.
http://electronica-pic.blogspot.com
-
hola
es un cable que chequea una maquina dispensadora, con esta orden se ponen a cero todos los contadores, y borra las averias memorizadas
el cable solo trabaja con ordenes en hexadecimal y no se pueden enviar &2f... solo admite 2f ... y tambien recive de la misma manera .
la unica diferencia que veo yo en el envio del fabricante es que hay un espacio entre2F 50 50 03
que seria 20 en hex pero este 20 n0 sale y si yo envio espacio si me sale 20 y sigue fallando, el fabricante solo lee del dispositivo/unidad cuando esta tiene dato 6F505003 en menos de 30seg si no da error gestionado.
a mi haga lo que haga siempre recivo error 7F...
un saludo
-
Buenas zocopeo:
Puedes usar un HyperTerminal de Windows XP o otro mejor. Con él puedes leer los datos de salida y entrada o simplemente haces un programa en Visual .net que te lea todos los datos de entrada y de salida.
Si tuviera ese aparato o cualquiera con puerto serie. Por cada orden que envío, capturo los datos en hex y los guardo para luego analizarlo uno mismo. Después de esa orden, también reviso cuál datos de entradas recibo, por ejemplo. Un Ok, que todo está bien.
Lo que estás haciendo son ya cosas de protocolo RS232 y las órdenes que tiene el dispositivo.
Hasta con un PIC puedes enviar esas órdenes y recibirla.
Para que te hagas una idea sobr el protocolo y lo que quieres hacer, el que iba hacer es con la calculadora CASIO desde el puerto serie. Se puede programar esa calculadora en Basic y enviar y recibir datos por puerto COM.
http://www.reocities.com/ResearchTriangle/System/9627/protocolo.htm
Un saludo.
http://electronica-pic.blogspot.com
- Editado Metaconta domingo, 18 de marzo de 2012 19:26
-
hola
si lohago con hiperterminal y con otros programa de lectura del serie y siempre me da el error de 7f2f7f
en cambio el programa del fabricante siempre da respusta corecta
la unica diferencia que observo es que el imprime unos espacios en blanco y yo no se como se imprimen estos espacios
un saludo
-
Hola:
Se usa la tabla ASCII. Sea enviado desde el PIC al PC o al revés, sea como sea, se usa los códigos en hex, bin o lo que sea como indica aquí abajo.
En hexadecimal se envía el 20, ese es el espacio en blanco.
Un saludo.
http://electronica-pic.blogspot.com
-
hola a todos y gracias
solucionado
me habia comido un 20 en hex, es decir un espacio el del final , que no se ve como es logico .
se me ha ocurrido probar a la desesperada y pan , hecho
gracias a todos
solucionado
- Marcado como respuesta zocopeo domingo, 1 de abril de 2012 0:26
-