Lo más probable es que el problema sea lo que comenta J1M. Lo único que quería apuntar es esto, atención a la instrucción:
ReceivePacket(receive_buf, &RecvLength);en la variable RecvLength se guarda el número de bytes leídos, allí puedes verificar que hayas leído el número que esperas, que seguramente devolvió 1 en las ocasiones que no te ha funcionado como deseas (de allí ya puedes ver que la operación de lectura no es el problema

).
Por otro lado, estoy haciendo una prueba para realizar una multiplicación en lugar de una suma. El resultado va en una variable de 2 bytes, así que la separo para meterla al vector de dos bytes que se envía, sin embargo, por más intentos que he hecho siempre recibo un 0 en el byte que representa la parte alta

.
int16 mul;
mul = param1 * param2;
envia[ 0 ] = mul & 0xff;
envia[ 1 ] = ( mul & 0xff00 ) >> 8;
No importa lo que haga, al leer en la computadora el segundo byte siempre es 0

, ¿alguien conoce alguna particularidad del compilador CCS que sobre los corrimientos?
-----------------------------
Edit:
Ya lo arreglé, es sólo que el compilador me hizo pensar un poco. El problema es que al multiplicar dos int8 el resultado es un int8, no como en la PC

, ni como en los Motorola

, ya me iré acostumbrando al C en los PIC

.
int16 mul;
int16 a, b;
a = param1; b = param2;
mul = a * b;
// o también
mul = ( int16 )param1 * ( int16 )param2;
Saludos.