Autor Tema: Mejorar transmisión RS232  (Leído 1644 veces)

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

Desconectado Elisur

  • PIC10
  • *
  • Mensajes: 12
Mejorar transmisión RS232
« en: 21 de Febrero de 2005, 04:10:00 »
Hola a todos.
Estoy desarrollando un proyecto para la adquisición de datos de un detector de emisiones radioactivas.

Se trata de capturar los datos que genera el detector y enviarlos al pc, pero la idea es que el pc muestre en tiempo casi real la información que vamos obteniendo. Para ello he diseñado un circuito con dos pics (18F452) que se comunican entre ellos, de tal forma que uno de ellos esta capturando los datos, cuando el pc requiere esos datos el pic da la orden al otro pic para que se ponga a capturar, y así mientras el primer pic puede enviar la información cómodamente y sin prisas al pc. Cuando el pc vuelve a solicitar los datos vuelve a ocurrir lo mismo, el pic que estaba capturando pasa el control al otro pic, y manda los datos al pc.

Esta parte parece funcionar bastante bien, mi problema viene ahora.


La información que envio al pc es una ristra de 512 valores. El pc en cuanto tiene todos los datos vuelve a solicitar de nuevo más, así pues estoy recibiendo datos continuamente en el puerto.

La cuestión está en que este sistema funciona bien durante un rato (10-12min) después, enpieza a haber problemas de comunicación, los datos llegan corruptos, o las ordenes que envio a los pics desde el pc a veces no llegan.

El código que uso para enviar los datos desde los pics está hecho con el CCS C y es el siguiente:

    for (i=0;i<256;i++) {
        printf("%lu:",canales0_255);
        }
    for (i=0;i<128;i++) {
        printf("%U:",canales256_383);
        }

    for (i=0;i<128;i++) {
        printf("%U:",canales384_511);
        }

    printf("%c",26);//Marca el final del envio



Y el código que uso desde el pc para capturar los datos está hecho en C++Builder y es:

void __fastcall TComunicaciones::MSComm1Comm(TObject *Sender){
      if (MSComm1->CommEvent==comEvReceive) {
          dato=dato + MSComm1->Input.operator String();

           //Si me llega el caracter que  marca el final del envio

           if (dato.c_str()[dato.Length()-1]=="x1A") {
               //Aquí extraigo los datos que me llegan y los guardo en "matriz"
                (...)
               dato="";
               //Cuando ya  hemos almacenado los datos

               MSComm1->Output=AnsiString("2"Giño; //Vuelvo a pedir datos a los pics
               }
           }
      }


He probado a diferentes velocidades de transmisión, en distintos ordenadores, y en distintos sistemas operativos  y siempre tengo el mismo problema.

Otra prueba que hice fue la de enviar los datos, en lugar de desde los pics, desde otro pc (usando un cable que uniera los puertos COM) y el resultado fue el mismo (esto descarta que el fallo venga desde el circuito).

Tal vez el problema venga del control MSComm o de la gestión de puertos que haga el sistema operativo (porque sí que es cierto que en las pruebas que hice en sistemas operativos WXP duraba más tiempo funcionando que en W98).

Alguien tiene alguna sugerencia

Gracias a todos de antemano

Desconectado Elisur

  • PIC10
  • *
  • Mensajes: 12
RE: Mejorar transmisión RS232
« Respuesta #1 en: 07 de Marzo de 2005, 03:44:00 »
Bueno, ya por fin he conseguido hacerlo funcionar.

Al parecer el problema provenia de un control activex que usaba en la aplicación para mostrar la gráfica de datos que provenían del circuito. Este control usaba un hilo de alta prioridad para actualizarse y por lo visto le quitaba recursos al control MSComm haciendo que al final acabara fallando la transmisión.

Por si a alguien le interesa, de todas las pruebas que hice para intentar mejorar la transmisión 232, la única que ha dado buenos resultados es la de usar un conversor de 232 a USB, que hizo que la adquisición de datos permaneciera más tiempo funcionando incluso con el control activex antes mencionado.

Un saludo a todos.