none
Problema al solicitar datos del bus USB y no recibir respuesta. RRS feed

  • Pregunta

  • Desarrollo una aplicación en visual c++ para la comunicación entre un dispositivo usb y el pc. La configuración de drivers es correcta, y la conexión y selección del COM virtual   funciona. El dispositivo proporciona APIs con las que controlar la comunicación.

    El problema viene cuando realizo petición de datos por el USB, que la aplicación se cuelga. Intuyo que pueda entrar en un bucle de espera hasta recibir los datos que por la razón que sea nunca llegan. Casi siempre sucede lo contrario y recibo algo,  ya sea la respuesta correcta o  un código de error. ¿no existe alguna solución  para salir de ese lazo de otra forma que no sea forzando el reinicio de la aplicación?

    Gracias.


    DavidSA
    jueves, 21 de octubre de 2010 17:00

Todas las respuestas

  • Hoy recibí la aplicación oficial que usa la  empresa que entre otras cosas hace lo mismo que yo quiero. La sorpresa es que se bloquea de forma idéntica en ese punto. Esta claro que mi puerto USB o el dispositivo estarán fallando en algo. Sin embargo no me quiero conformar con simplemente aceptar el cuelque.

    He pensado que podria hacer algún Time out que controlara el tiempo de ejecución de esa función y  en caso de superar 5 segundos cerrarlo y evitar el cuelque. No me interesa cerrar el proceso entero porque cerrar la aplicación sin previo aviso es igual de molesto que el cuelgue de la misma.

    gracias.


    DavidSA
    viernes, 22 de octubre de 2010 11:05
  • ¿Podría conseguir lo que quiero creando un subproceso con la clase Thread?

    El problema está en que no puedo modificar la función problemática con lo cual mi idea es crear un subproceso con timeout de 5 segundos:

    char* FProblematica (int a, char* cadena);

     

    //LLamada a función problemática:

    using namespace System::Threading

    char puerto[]="COM3";

    Thread worker=  gcnew Thread(FProblematica(5,puerto));
         worker.Start();

         if (!worker.Join(5000)){

         worker.Abort();
         return -1;
         }

    En el ejemplo de MSDN el método a ejecutar con timeout no tiene parámetros, pero el mio si por lo que no compila.

    ¿Qué puedo hacer?

    gracias.


    DavidSA
    viernes, 22 de octubre de 2010 12:52
  • A ver, si Join no trae parámetros tu no puedes añadir ninguno. Lo que sí puedes hacer es matarlo cuando te interese, con Abort() o con Terminate().

    Ahora bien, la solución correcta sería que la función pertinente se modifique para que funcione bien, porque matar un thread que deje un puerto serie abierto y otros recursos a medio hacer no es nada bueno.


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    sábado, 23 de octubre de 2010 18:21
    Moderador
  • La verdad es que he hecho pruebas en otros equipos y me funcionan ambas aplicaciones al 100% siempre. Pero he estado tantas horas corrigiendo errores que  me duele que sigua bloqueandose alguna vez en algunos equipos. La función pertenece a una libreria dinamica .dll que trae el lector y no creo que pueda y/o deba modificarla.

    gracias.


    DavidSA
    domingo, 24 de octubre de 2010 22:25
  • ¿Son multicore los equipos en donde falla y con uno sólo en los que no? También podría tener problemas en aquellos en los que tengan alta carga de procesao y poca memoria. Suelen fallar más por temas de sincronización ya que al tener mucha carga el núcleo interrumpe más frecuentemente y hace que se vean con más frecuencia dichos problemas.

    No obstante, sin código y sin posibilidad de mirar cómo está hecha la DLL poco se puede hacer.


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    lunes, 25 de octubre de 2010 10:36
    Moderador