none
como esperar una respuesta deseada del puerto serie RRS feed

  • 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

    miércoles, 1 de febrero de 2012 20:24

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
    domingo, 1 de abril de 2012 0:25

Todas las respuestas

  • hola

    nadie puede ayudarme

     

    un saludo

    sábado, 4 de febrero de 2012 11:48
  • 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 reset

    Si te parece vamos avanzando a medida que aclaramos dudas,

    Saludos,
    PepLluis,


    MVP - Visual Developer

    domingo, 12 de febrero de 2012 10:31
    Moderador
  • 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

    jueves, 23 de febrero de 2012 21:59
  • 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 progresbar

                Port1.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 Sub

    y 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 Export

    Pedido: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..>





    domingo, 18 de marzo de 2012 8:44
  • 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

    domingo, 18 de marzo de 2012 10:14
  • 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

    domingo, 18 de marzo de 2012 16:59
  • 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
    domingo, 18 de marzo de 2012 19:22
  • 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

    sábado, 31 de marzo de 2012 10:56
  • 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

    sábado, 31 de marzo de 2012 18:47
  • 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
    domingo, 1 de abril de 2012 0:25
  • Mucha suerte campeón. ;)

    http://electronica-pic.blogspot.com

    domingo, 1 de abril de 2012 21:04