Autor Tema: Ayuda para mejorar el tiempo de transmisión de datos hacia un PIC  (Leído 2676 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Estimados,
necesito su ayuda para un proyecto que tengo. La función del programa es la de abrir un archivo txt con 32767 lineas, cada linea tiene un número tipo "double". Ese número tipo "double" se convierte en un hexa de 12 bit. Ese número se divide en 2 números de 8 bits, o sea, se toman los 4 más significativos y se le agregan 4 ceros a la izquierda y se guardan en el array MSDatos, los 8 menos significativos se guardan en el array LSDatos(). El envío es en el siguiente orden, LSDatos(0), MSDatos(0), LSDatos(1), MSDatos(1), etc.
Se envían al PIC por el puerto USB utilizando un puerto COM virtual. Todo muy lindo hasta acá, el problema es que para mandar esa cantidad de datos la transferencia demora 8 minutos 33 segundos :?.
En el código van a ver un Sleep(1), eso es un retardo de un milisegundo, si no lo pongo, al parecer hay un desbordamiento en el buffer del PIC y no llegan todos los datos. (Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long))


Está es la función que envía los datos:

Código: [Seleccionar]

 Private Sub Enviar()
    Dim j As Integer                                            'variable usada para repetir la señal
   
        stbEstado.Panels(1).Text = "Enviando Datos..."          'la barra de estado muestra el inicio del envío
                   
        prbEnvio.Max = 32767                                    'cargo el máximo de la barra de progreso
       
        For j = 0 To 32766                                      'se enviaran 32767 datos, el valor final es 32766 porque de lo contrario entra en bucle infinito debido a la resta que hay antes de salir del for
       
            For n = 0 To (UBound(funcion))                      'N representa la cantidad de datos contenida en el array función()
                If j = 32767 Then                               'si j vale 32767, sale del bucle, significa que ya se enviaron 32767 datos
                    Exit For                                    'salida del bucle for secundario
                Else
                    If n Mod 2 Then                             'si n es impar se envía MSDatos de lo contrario LSDatos
                        puerto.Output = MSDatos(n) & vbCr      'envío la parte menos significativos de los datos
                        puerto.OutBufferCount = 0
                    Else
                        puerto.Output = LSDatos(n) & vbCr     'envío la parte más significativos de los datos
                        puerto.OutBufferCount = 0
                    End If
                    j = j + 1                                   'incremento j
                End If
               
                Sleep (1)

                prbEnvio.Value = j                              'carga el valor actual de la barra de progreso
                stbEstado.Panels(1).Text = "Enviados " & j _
                                        & " de 32767 datos"     'la barra de estado muestra la cantidad de datos envíados

            Next
           
            j = j - 1                                           'se resta 1 a j porque el for inicial incrementa en 1 a j, provocando que saltee un valor del for interno provocando que
                                                                'la señal de salida falten datos debido al "salteo" de los mismos. También hay un desbordamiento porque j llega hasta 32768
        Next
       
        ReDim LSDatos(1)                                        'dimensiono los arrays para liberar memoria del pc
        ReDim MSDatos(1)                                        'dimensiono los arrays para liberar memoria del pc
       
End Sub



La pregunta es: ¿cómo puedo mejorar el tiempo de envío de los datos?

Otro problema es que cuando se están enviando los datos la ventana queda "dura", o sea, aparece el cartel "no responde" en la barra del titulo. ¿cómo puedo solucionar esto?


Bueno gente, desde ya les digo muchas gracias y quedo a la espera de sus respuestas.


Abrazo!

Desconectado esteban_68

  • PIC12
  • **
  • Mensajes: 86
Re: Ayuda para mejorar el tiempo de transmisión de datos hacia un PIC
« Respuesta #1 en: 07 de Agosto de 2011, 22:20:57 »
¿qué tipo de handshake estás usando? Si estás usando el timeout por default VB se incrementará mucho el tiempo de ejecución cuando envías una gran cantidad de datos, como es tu caso.

Lo mejor sería que usaras handshake por hardware, y ahí si VB responde a la brevedad cuando detecta esas señales.

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Ayuda para mejorar el tiempo de transmisión de datos hacia un PIC
« Respuesta #2 en: 07 de Agosto de 2011, 22:30:25 »
¿y a como tienes la propiedad OutBufferSize?

si usas Sleep, estas saliendo del vb y por lo tanto hasta que la API no se regrese de su llamado, el vb se detendrá, debes usar retardos usando el control timer
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: Ayuda para mejorar el tiempo de transmisión de datos hacia un PIC
« Respuesta #3 en: 07 de Agosto de 2011, 23:03:24 »
esteban_68:
el handshake es el que tiene por defecto, ¿pero cómo hago un handshake por HW si estoy mandando datos por el puerto USB?

PalitroqueZ:
OutBufferSize=1024
¿cómo hago un retardo con el control timer? por favor pone un ejemplo!!!

Muchas gracias a ambos por la velocidad en la respuesta.

Abrazo!

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: Ayuda para mejorar el tiempo de transmisión de datos hacia un PIC
« Respuesta #4 en: 18 de Agosto de 2011, 23:08:57 »
Quedo andando  :-/

Ahora tengo 1 minuto 20 seg para pasar los 65kbytes a 19600 baudios,


le saque el Sleep (1) y le agrege el timer  :lol:

Aparte de esto le cambie la paridad para transmitir, en lugar de 8N1 pase a 8N2, asi le da al tiempo al PIC para recibir todos los datos (sino se me perdian datos en el camino)

Luego subo el codigo andando!

Muchas gracias por su ayuda!