Hago un paso a paso de tu codigo.
Espero caracter de la PC.
LLego alguno que me interese?
SI -> Delay de 2s Tomo lectura del ADC y envio.
El problema esta si por ejemplo tu computadora envia 1 caracter cada 0.5s supongamos, exigiendo al PIC que le responda con lo que le pide.
Veamos que pasa.
El primer caracter llega, y entra al switch case que le corresponde, y luego entra al delay de 2s.
Y aca es donde ocurre el problema... la PC a los 0.5s va a enviar otro caracter, y ocupar el unico espacio libre que posee el PIC para recibir, al segundo va a enviar OTRO mas pero vos nunca sacaste ese caracter que llego (porque estas en el delay). Internamente el PIC cuando ocurre esto deja de recibir y marca un error avisando que se intento sobreescribir el dato que habia llegado. CCS tiene sus formas raras de manejarse y tal ves omita el error
Pero te comento lo que puede suceder.
---------------------------------------------
Respecto a tomar varias lecturas y promediarlas podes hacer:
int16 suma
for ( i = 0; i < 8; i++ )
{
suma += read_adc();
}
suma /= 8;
// Y enviar suma
Asi promedias tus valores. Y si hay alguna medida que posee algun "impulso" o valor grande no afecte en gran medida la lectura.
No creo que necesites GRAN velocidad si es que tenes un delay de 2s
-------------------------
Ahora que me fijo en el codigo ( que te recomiendo que lo copies y pegues, en ves de poner capturas de pantalla )
Deberias mover los setup_adc() afuera del while. Ya que estos deberias usarlos una sola ves nomas.