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" //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