what i suspected.
and that is why i told you to use the debugger and look at the received data in the variables view. no led out bullshit, because you saw the correct number of high/low bits but not the right polarity. variables view in the debugger would have shown you the actual "char", or even by looking at the bits it would have been immediate.
If you don't have a programmer with a debugger put aside whatever you use and buy one, like the pickit3. clones are cheaper these days and it works just fine if you remain in windows. (can't make mine work in osx since Mavericks, don't know why. Original ones work, though)
About calling routines inside ISR..
http://www.microchip.com/forums/m775681.aspxNot using this to prove my point, as it becomes a discussion about pros and cons..
but what come out of this is that it is fine, if you know the limitations.
I strongly advice against calling routines inside the ISR, because the init code becomes much messier as you have to save -again- a whole set of register.. to do what? copy one buffer? not worth it. double the latency for one instruction.
And if you have to work with 24E/33E family, which has a much greater interrupt latency, greater return from call latency and 2 clock cycles for rms instructions to non-sfr memory* (in this case, saving and loading sets to software stack, push and pop shadow registers might not be enough)
you certainly don't want to do this, unless it's very important to be as much abstract as you can (like in the CAN example)
*yes, i know it sounds bad, but in 33e you get more than double the MIPS and very advanced peripherals.. so when you're not moving around stuff to from/to ram you really have improved performances