I know this is way past the useful date for this thread, but this thread was the first that came up when I was googling for similar problems, so hopefully this is useful for someone else.
Took me a while to figure this out, but there is indeed an error in the fletcher checksum implementation in OP (none of the other code posted by other answer actually try to compute the checksum and is thus irrelevant).
Instead of
//Calculate checksum
for(int i=0; i<len; i++){
CK_A = CK_A + MSG[i];
CK_B = CK_B + CK_A;
Serial.println("CK_A= " + String(CK_A));
Serial.println("CK_B= " + String(CK_B));
}
sum1 = CK_A &0xff;//Mask the checksums to be one byte
sum2= CK_B &0xff;
the mask needed to be applied at each stage of the computation, so the correct code should be
//Calculate checksum
for(int i=0; i<len; i++){
CK_A = CK_A + MSG[i];
CK_B = CK_B + CK_A;
CK_A = CK_A & 0xff;
CK_B = CK_B & 0xff;
Serial.println("CK_A= " + String(CK_A));
Serial.println("CK_B= " + String(CK_B));
}
sum1 = CK_A;
sum2= CK_B;